scroll kinda working now
							parent
							
								
									e0f48e7841
								
							
						
					
					
						commit
						3811dd0a11
					
				| 
						 | 
					@ -0,0 +1,548 @@
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//  CrownOfThorns.swift
 | 
				
			||||||
 | 
					//  gloss
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//  Created by Saint on 3/3/23.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Foundation
 | 
				
			||||||
 | 
					import SwiftUI
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					struct MyCustomShape: Shape {
 | 
				
			||||||
 | 
					    func path(in rect: CGRect) -> Path {
 | 
				
			||||||
 | 
					        var path = Path()
 | 
				
			||||||
 | 
					        let width = rect.size.width * 0.1
 | 
				
			||||||
 | 
					        let height = rect.size.height * 0.1
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 5.05217*width, y: 9.63163*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.91142*width, y: 9.41742*height), control1: CGPoint(x: 4.98917*width, y: 9.57057*height), control2: CGPoint(x: 4.93701*width, y: 9.48949*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.875*width, y: 9.17718*height), control1: CGPoint(x: 4.88681*width, y: 9.34535*height), control2: CGPoint(x: 4.86811*width, y: 9.22623*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.87697*width, y: 9.13914*height), control1: CGPoint(x: 4.87795*width, y: 9.15616*height), control2: CGPoint(x: 4.87894*width, y: 9.13914*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.63386*width, y: 9.08008*height), control1: CGPoint(x: 4.85039*width, y: 9.13914*height), control2: CGPoint(x: 4.69783*width, y: 9.1021*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.8435*width, y: 8.53253*height), control1: CGPoint(x: 4.38681*width, y: 8.99499*height), control2: CGPoint(x: 4.18799*width, y: 8.85786*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.46654*width, y: 8.19419*height), control1: CGPoint(x: 3.63681*width, y: 8.33734*height), control2: CGPoint(x: 3.54626*width, y: 8.25726*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.91437*width, y: 7.91491*height), control1: CGPoint(x: 3.3061*width, y: 8.06907*height), control2: CGPoint(x: 3.13484*width, y: 7.98298*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.78937*width, y: 7.85686*height), control1: CGPoint(x: 2.82579*width, y: 7.88789*height), control2: CGPoint(x: 2.79921*width, y: 7.87487*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.80118*width, y: 7.9009*height), control1: CGPoint(x: 2.76575*width, y: 7.81381*height), control2: CGPoint(x: 2.77461*width, y: 7.84785*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.11811*width, y: 8.28729*height), control1: CGPoint(x: 2.87598*width, y: 8.05305*height), control2: CGPoint(x: 3.00295*width, y: 8.20721*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.63287*width, y: 8.44845*height), control1: CGPoint(x: 3.27854*width, y: 8.3974*height), control2: CGPoint(x: 3.44094*width, y: 8.44845*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 3.72933*width, y: 8.44845*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 3.88287*width, y: 8.59059*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.03543*width, y: 8.73974*height), control1: CGPoint(x: 3.96654*width, y: 8.66867*height), control2: CGPoint(x: 4.03543*width, y: 8.73574*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.8435*width, y: 8.77878*height), control1: CGPoint(x: 4.03543*width, y: 8.74675*height), control2: CGPoint(x: 3.95866*width, y: 8.76276*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.4252*width, y: 8.77377*height), control1: CGPoint(x: 3.73917*width, y: 8.79379*height), control2: CGPoint(x: 3.51969*width, y: 8.79079*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.13976*width, y: 8.68969*height), control1: CGPoint(x: 3.33858*width, y: 8.75776*height), control2: CGPoint(x: 3.2815*width, y: 8.74174*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.0315*width, y: 8.65866*height), control1: CGPoint(x: 3.0935*width, y: 8.67267*height), control2: CGPoint(x: 3.04528*width, y: 8.65866*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.83366*width, y: 8.76577*height), control1: CGPoint(x: 2.99114*width, y: 8.65866*height), control2: CGPoint(x: 2.8878*width, y: 8.71471*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.66732*width, y: 9.002*height), control1: CGPoint(x: 2.78543*width, y: 8.81181*height), control2: CGPoint(x: 2.66732*width, y: 8.97898*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.65748*width, y: 9.003*height), control1: CGPoint(x: 2.66732*width, y: 9.00901*height), control2: CGPoint(x: 2.66437*width, y: 9.01001*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.63878*width, y: 8.76977*height), control1: CGPoint(x: 2.64075*width, y: 8.98599*height), control2: CGPoint(x: 2.62894*width, y: 8.84284*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.7628*width, y: 8.47247*height), control1: CGPoint(x: 2.65059*width, y: 8.67267*height), control2: CGPoint(x: 2.6811*width, y: 8.5986*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.71752*width, y: 8.38038*height), control1: CGPoint(x: 2.77461*width, y: 8.45345*height), control2: CGPoint(x: 2.77165*width, y: 8.44545*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.5374*width, y: 8.11311*height), control1: CGPoint(x: 2.64665*width, y: 8.29429*height), control2: CGPoint(x: 2.59646*width, y: 8.22022*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.36122*width, y: 7.67768*height), control1: CGPoint(x: 2.47638*width, y: 8.003*height), control2: CGPoint(x: 2.45079*width, y: 7.93994*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.28445*width, y: 7.46146*height), control1: CGPoint(x: 2.3189*width, y: 7.55355*height), control2: CGPoint(x: 2.28445*width, y: 7.45646*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.32776*width, y: 7.61161*height), control1: CGPoint(x: 2.28346*width, y: 7.46547*height), control2: CGPoint(x: 2.30315*width, y: 7.53353*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.37205*width, y: 7.76076*height), control1: CGPoint(x: 2.35236*width, y: 7.69069*height), control2: CGPoint(x: 2.37205*width, y: 7.75776*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.06791*width, y: 7.64665*height), control1: CGPoint(x: 2.37205*width, y: 7.77177*height), control2: CGPoint(x: 2.17323*width, y: 7.6977*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.5935*width, y: 7.27027*height), control1: CGPoint(x: 1.87992*width, y: 7.55556*height), control2: CGPoint(x: 1.69882*width, y: 7.41241*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.53642*width, y: 7.2002*height), control1: CGPoint(x: 1.57087*width, y: 7.23824*height), control2: CGPoint(x: 1.54429*width, y: 7.20621*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.25689*width, y: 7.24825*height), control1: CGPoint(x: 1.50098*width, y: 7.17017*height), control2: CGPoint(x: 1.36516*width, y: 7.19319*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.09547*width, y: 7.35435*height), control1: CGPoint(x: 1.19882*width, y: 7.27828*height), control2: CGPoint(x: 1.18209*width, y: 7.28929*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.06004*width, y: 7.38238*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.06594*width, y: 7.33534*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.32972*width, y: 6.93994*height), control1: CGPoint(x: 1.08661*width, y: 7.17918*height), control2: CGPoint(x: 1.18602*width, y: 7.03103*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.38287*width, y: 6.88288*height), control1: CGPoint(x: 1.37894*width, y: 6.90991*height), control2: CGPoint(x: 1.3878*width, y: 6.8999*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.3189*width, y: 6.44144*height), control1: CGPoint(x: 1.34154*width, y: 6.73473*height), control2: CGPoint(x: 1.3189*width, y: 6.57958*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.35827*width, y: 6.07107*height), control1: CGPoint(x: 1.3189*width, y: 6.33734*height), control2: CGPoint(x: 1.34547*width, y: 6.08609*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.37303*width, y: 6.01602*height), control1: CGPoint(x: 1.36319*width, y: 6.06507*height), control2: CGPoint(x: 1.37008*width, y: 6.04004*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.36811*width, y: 6.004*height), control1: CGPoint(x: 1.37795*width, y: 5.97397*height), control2: CGPoint(x: 1.37697*width, y: 5.97297*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.34941*width, y: 6.03604*height), control1: CGPoint(x: 1.3622*width, y: 6.02102*height), control2: CGPoint(x: 1.35335*width, y: 6.03604*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.18898*width, y: 5.85085*height), control1: CGPoint(x: 1.33858*width, y: 6.03604*height), control2: CGPoint(x: 1.25295*width, y: 5.93694*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 0.92028*width, y: 5.26527*height), control1: CGPoint(x: 1.06004*width, y: 5.67768*height), control2: CGPoint(x: 0.94685*width, y: 5.43043*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 0.84252*width, y: 5.14014*height), control1: CGPoint(x: 0.90945*width, y: 5.1992*height), control2: CGPoint(x: 0.89075*width, y: 5.16917*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 0.58661*width, y: 5.08509*height), control1: CGPoint(x: 0.77657*width, y: 5.1011*height), control2: CGPoint(x: 0.74606*width, y: 5.09409*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 0.4311*width, y: 5.06707*height), control1: CGPoint(x: 0.50689*width, y: 5.08108*height), control2: CGPoint(x: 0.43602*width, y: 5.07207*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 0.59055*width, y: 4.93594*height), control1: CGPoint(x: 0.41831*width, y: 5.05405*height), control2: CGPoint(x: 0.51476*width, y: 4.97497*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 0.82579*width, y: 4.86887*height), control1: CGPoint(x: 0.66535*width, y: 4.8969*height), control2: CGPoint(x: 0.73228*width, y: 4.87788*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 0.90551*width, y: 4.86186*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 0.91535*width, y: 4.82082*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.24705*width, y: 4.19419*height), control1: CGPoint(x: 0.97933*width, y: 4.56456*height), control2: CGPoint(x: 1.0748*width, y: 4.38338*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.55413*width, y: 3.88388*height), control1: CGPoint(x: 1.29429*width, y: 4.14114*height), control2: CGPoint(x: 1.43307*width, y: 4.001*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.16142*width, y: 2.90591*height), control1: CGPoint(x: 1.97244*width, y: 3.47548*height), control2: CGPoint(x: 2.0561*width, y: 3.34034*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.24902*width, y: 2.74474*height), control1: CGPoint(x: 2.18898*width, y: 2.79179*height), control2: CGPoint(x: 2.20079*width, y: 2.77077*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.53543*width, y: 2.64264*height), control1: CGPoint(x: 2.30217*width, y: 2.71672*height), control2: CGPoint(x: 2.51083*width, y: 2.64264*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.55413*width, y: 2.68068*height), control1: CGPoint(x: 2.55807*width, y: 2.64264*height), control2: CGPoint(x: 2.55906*width, y: 2.64565*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.41732*width, y: 3.23323*height), control1: CGPoint(x: 2.54035*width, y: 2.75776*height), control2: CGPoint(x: 2.45079*width, y: 3.12312*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.4252*width, y: 3.47047*height), control1: CGPoint(x: 2.37106*width, y: 3.38338*height), control2: CGPoint(x: 2.37205*width, y: 3.3974*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.67717*width, y: 3.66567*height), control1: CGPoint(x: 2.47835*width, y: 3.54454*height), control2: CGPoint(x: 2.5689*width, y: 3.61562*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.74213*width, y: 3.71972*height), control1: CGPoint(x: 2.75295*width, y: 3.7017*height), control2: CGPoint(x: 2.75886*width, y: 3.70671*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.41142*width, y: 3.74474*height), control1: CGPoint(x: 2.6939*width, y: 3.75576*height), control2: CGPoint(x: 2.50295*width, y: 3.76977*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.30118*width, y: 3.7027*height), control1: CGPoint(x: 2.38681*width, y: 3.73774*height), control2: CGPoint(x: 2.3376*width, y: 3.71872*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.22146*width, y: 3.67367*height), control1: CGPoint(x: 2.26575*width, y: 3.68669*height), control2: CGPoint(x: 2.22933*width, y: 3.67367*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.16043*width, y: 3.73674*height), control1: CGPoint(x: 2.21358*width, y: 3.67367*height), control2: CGPoint(x: 2.18602*width, y: 3.7017*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.89567*width, y: 4.01902*height), control1: CGPoint(x: 2.13386*width, y: 3.77077*height), control2: CGPoint(x: 2.01476*width, y: 3.8979*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.70472*width, y: 4.21522*height), control1: CGPoint(x: 1.77559*width, y: 4.14014*height), control2: CGPoint(x: 1.68996*width, y: 4.22823*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.73228*width, y: 4.1952*height), control1: CGPoint(x: 1.72047*width, y: 4.2012*height), control2: CGPoint(x: 1.73228*width, y: 4.19319*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.7815*width, y: 4.3974*height), control1: CGPoint(x: 1.73228*width, y: 4.1982*height), control2: CGPoint(x: 1.75492*width, y: 4.28929*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.84941*width, y: 4.71271*height), control1: CGPoint(x: 1.80906*width, y: 4.50651*height), control2: CGPoint(x: 1.83957*width, y: 4.64865*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.9124*width, y: 4.88789*height), control1: CGPoint(x: 1.87303*width, y: 4.85485*height), control2: CGPoint(x: 1.87402*width, y: 4.85786*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.34449*width, y: 4.97598*height), control1: CGPoint(x: 2.01575*width, y: 4.96697*height), control2: CGPoint(x: 2.16831*width, y: 4.999*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.34055*width, y: 5.04204*height), control1: CGPoint(x: 2.40945*width, y: 4.96797*height), control2: CGPoint(x: 2.40945*width, y: 4.97397*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.95768*width, y: 5.1992*height), control1: CGPoint(x: 2.24016*width, y: 5.14114*height), control2: CGPoint(x: 2.10335*width, y: 5.1972*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.87106*width, y: 5.2002*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.86614*width, y: 5.23524*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.76673*width, y: 5.77578*height), control1: CGPoint(x: 1.84252*width, y: 5.3984*height), control2: CGPoint(x: 1.81988*width, y: 5.52052*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.69882*width, y: 6.71471*height), control1: CGPoint(x: 1.65551*width, y: 6.2993*height), control2: CGPoint(x: 1.64272*width, y: 6.48248*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.1752*width, y: 7.30731*height), control1: CGPoint(x: 1.75689*width, y: 6.95495*height), control2: CGPoint(x: 1.94685*width, y: 7.19119*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.24705*width, y: 7.35135*height), control1: CGPoint(x: 2.21063*width, y: 7.32533*height), control2: CGPoint(x: 2.24311*width, y: 7.34535*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.10039*width, y: 6.95195*height), control1: CGPoint(x: 2.27264*width, y: 7.38639*height), control2: CGPoint(x: 2.1565*width, y: 7.06907*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.72343*width, y: 6.43644*height), control1: CGPoint(x: 2.02756*width, y: 6.7968*height), control2: CGPoint(x: 1.97244*width, y: 6.72172*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.6811*width, y: 6.38739*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.69685*width, y: 6.25926*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.75*width, y: 6.00801*height), control1: CGPoint(x: 1.71949*width, y: 6.08709*height), control2: CGPoint(x: 1.73425*width, y: 6.01301*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.1752*width, y: 6.44444*height), control1: CGPoint(x: 1.76575*width, y: 6.003*height), control2: CGPoint(x: 2.11516*width, y: 6.36036*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.26476*width, y: 6.50651*height), control1: CGPoint(x: 2.2185*width, y: 6.5035*height), control2: CGPoint(x: 2.22047*width, y: 6.50551*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.62795*width, y: 6.35736*height), control1: CGPoint(x: 2.38484*width, y: 6.50751*height), control2: CGPoint(x: 2.50394*width, y: 6.45846*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.70276*width, y: 6.2993*height), control1: CGPoint(x: 2.66831*width, y: 6.32432*height), control2: CGPoint(x: 2.70177*width, y: 6.2983*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.69587*width, y: 6.36136*height), control1: CGPoint(x: 2.70374*width, y: 6.3003*height), control2: CGPoint(x: 2.70079*width, y: 6.32833*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.45079*width, y: 6.74675*height), control1: CGPoint(x: 2.67618*width, y: 6.49249*height), control2: CGPoint(x: 2.56004*width, y: 6.67467*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.40157*width, y: 6.78278*height), control1: CGPoint(x: 2.42421*width, y: 6.76476*height), control2: CGPoint(x: 2.40157*width, y: 6.78078*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.45276*width, y: 6.91391*height), control1: CGPoint(x: 2.40157*width, y: 6.78478*height), control2: CGPoint(x: 2.42421*width, y: 6.84384*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.57972*width, y: 7.27227*height), control1: CGPoint(x: 2.48031*width, y: 6.98398*height), control2: CGPoint(x: 2.5374*width, y: 7.14615*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.6565*width, y: 7.49049*height), control1: CGPoint(x: 2.62205*width, y: 7.3994*height), control2: CGPoint(x: 2.6565*width, y: 7.4975*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.3002*width, y: 7.68468*height), control1: CGPoint(x: 2.65846*width, y: 7.46446*height), control2: CGPoint(x: 3.11909*width, y: 7.6026*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.43406*width, y: 7.71672*height), control1: CGPoint(x: 3.39075*width, y: 7.72573*height), control2: CGPoint(x: 3.40059*width, y: 7.72773*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.73819*width, y: 7.41241*height), control1: CGPoint(x: 3.54134*width, y: 7.68168*height), control2: CGPoint(x: 3.66535*width, y: 7.55856*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 3.7687*width, y: 7.35335*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 3.78051*width, y: 7.38238*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.79331*width, y: 7.54254*height), control1: CGPoint(x: 3.78937*width, y: 7.4014*height), control2: CGPoint(x: 3.79331*width, y: 7.45946*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.71161*width, y: 7.84785*height), control1: CGPoint(x: 3.79331*width, y: 7.68869*height), control2: CGPoint(x: 3.78248*width, y: 7.72873*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 3.67421*width, y: 7.91191*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 3.75098*width, y: 7.97497*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.16339*width, y: 8.35836*height), control1: CGPoint(x: 3.84646*width, y: 8.05405*height), control2: CGPoint(x: 4.05118*width, y: 8.24424*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.93602*width, y: 8.78779*height), control1: CGPoint(x: 4.4065*width, y: 8.60761*height), control2: CGPoint(x: 4.68406*width, y: 8.76176*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.48031*width, y: 8.67267*height), control1: CGPoint(x: 5.125*width, y: 8.80781*height), control2: CGPoint(x: 5.29626*width, y: 8.77077*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.59744*width, y: 8.61862*height), control1: CGPoint(x: 5.53642*width, y: 8.64264*height), control2: CGPoint(x: 5.58858*width, y: 8.61862*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.42421*width, y: 8.57958*height), control1: CGPoint(x: 5.63878*width, y: 8.61862*height), control2: CGPoint(x: 5.59055*width, y: 8.60761*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.64665*width, y: 8.58959*height), control1: CGPoint(x: 5.10925*width, y: 8.52553*height), control2: CGPoint(x: 4.93602*width, y: 8.52753*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.48031*width, y: 8.60861*height), control1: CGPoint(x: 4.53051*width, y: 8.61461*height), control2: CGPoint(x: 4.50098*width, y: 8.61862*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.21752*width, y: 8.4034*height), control1: CGPoint(x: 4.45472*width, y: 8.5976*height), control2: CGPoint(x: 4.29528*width, y: 8.47247*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.19193*width, y: 8.35936*height), control1: CGPoint(x: 4.18602*width, y: 8.37538*height), control2: CGPoint(x: 4.1811*width, y: 8.36637*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.69783*width, y: 8.23223*height), control1: CGPoint(x: 4.20965*width, y: 8.34735*height), control2: CGPoint(x: 4.5374*width, y: 8.26627*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.9252*width, y: 8.13814*height), control1: CGPoint(x: 4.8622*width, y: 8.1992*height), control2: CGPoint(x: 4.89469*width, y: 8.18519*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.00787*width, y: 7.81081*height), control1: CGPoint(x: 4.97638*width, y: 8.05906*height), control2: CGPoint(x: 5.00197*width, y: 7.95596*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.02067*width, y: 7.67768*height), control1: CGPoint(x: 5.00984*width, y: 7.73774*height), control2: CGPoint(x: 5.01575*width, y: 7.67768*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.14764*width, y: 7.84885*height), control1: CGPoint(x: 5.03445*width, y: 7.67768*height), control2: CGPoint(x: 5.11516*width, y: 7.78679*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.20669*width, y: 8.08408*height), control1: CGPoint(x: 5.18504*width, y: 7.92092*height), control2: CGPoint(x: 5.20669*width, y: 8.00601*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.2126*width, y: 8.17718*height), control1: CGPoint(x: 5.20669*width, y: 8.11812*height), control2: CGPoint(x: 5.20965*width, y: 8.16016*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.25*width, y: 8.20821*height), control1: CGPoint(x: 5.2185*width, y: 8.2042*height), control2: CGPoint(x: 5.22343*width, y: 8.20821*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.71063*width, y: 8.28829*height), control1: CGPoint(x: 5.2874*width, y: 8.20821*height), control2: CGPoint(x: 5.43012*width, y: 8.23323*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.92421*width, y: 8.33033*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 6.05512*width, y: 8.20621*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.41634*width, y: 7.89189*height), control1: CGPoint(x: 6.22638*width, y: 8.04505*height), control2: CGPoint(x: 6.28937*width, y: 7.98999*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 6.52067*width, y: 7.81181*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 6.52362*width, y: 7.73173*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.49606*width, y: 7.56657*height), control1: CGPoint(x: 6.52559*width, y: 7.66166*height), control2: CGPoint(x: 6.52165*width, y: 7.63864*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.4124*width, y: 7.4024*height), control1: CGPoint(x: 6.47933*width, y: 7.52052*height), control2: CGPoint(x: 6.44193*width, y: 7.44645*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.37303*width, y: 7.31932*height), control1: CGPoint(x: 6.37795*width, y: 7.34935*height), control2: CGPoint(x: 6.36417*width, y: 7.32132*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.5876*width, y: 7.4014*height), control1: CGPoint(x: 6.39665*width, y: 7.31331*height), control2: CGPoint(x: 6.53543*width, y: 7.36637*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.77756*width, y: 7.6046*height), control1: CGPoint(x: 6.65256*width, y: 7.44344*height), control2: CGPoint(x: 6.74016*width, y: 7.53754*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.81398*width, y: 7.65766*height), control1: CGPoint(x: 6.79331*width, y: 7.63363*height), control2: CGPoint(x: 6.80906*width, y: 7.65766*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.93701*width, y: 7.61662*height), control1: CGPoint(x: 6.81791*width, y: 7.65766*height), control2: CGPoint(x: 6.87303*width, y: 7.63964*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.29331*width, y: 7.51652*height), control1: CGPoint(x: 7*width, y: 7.59459*height), control2: CGPoint(x: 7.16043*width, y: 7.54955*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.55315*width, y: 7.45045*height), control1: CGPoint(x: 7.42618*width, y: 7.48348*height), control2: CGPoint(x: 7.54232*width, y: 7.45445*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.56496*width, y: 7.45646*height), control1: CGPoint(x: 7.56496*width, y: 7.44745*height), control2: CGPoint(x: 7.5689*width, y: 7.44945*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.63287*width, y: 7.45245*height), control1: CGPoint(x: 7.5561*width, y: 7.47047*height), control2: CGPoint(x: 7.58268*width, y: 7.46947*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.61614*width, y: 7.44645*height), control1: CGPoint(x: 7.67815*width, y: 7.43744*height), control2: CGPoint(x: 7.66929*width, y: 7.43443*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.57874*width, y: 7.44945*height), control1: CGPoint(x: 7.59547*width, y: 7.45145*height), control2: CGPoint(x: 7.57874*width, y: 7.45245*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.78445*width, y: 6.89489*height), control1: CGPoint(x: 7.57874*width, y: 7.43143*height), control2: CGPoint(x: 7.72835*width, y: 7.02903*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.85138*width, y: 6.73774*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.81791*width, y: 6.67467*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.54626*width, y: 6.43043*height), control1: CGPoint(x: 7.76575*width, y: 6.57457*height), control2: CGPoint(x: 7.68996*width, y: 6.50651*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.4685*width, y: 6.38939*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.51575*width, y: 6.37237*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.93012*width, y: 6.42042*height), control1: CGPoint(x: 7.63976*width, y: 6.32933*height), control2: CGPoint(x: 7.77756*width, y: 6.34535*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.02165*width, y: 6.46547*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.06791*width, y: 6.4034*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.42913*width, y: 5.95596*height), control1: CGPoint(x: 8.1063*width, y: 6.35335*height), control2: CGPoint(x: 8.33858*width, y: 6.06507*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.4498*width, y: 5.93093*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.42717*width, y: 5.94995*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.40157*width, y: 5.96496*height), control1: CGPoint(x: 8.41535*width, y: 5.96096*height), control2: CGPoint(x: 8.40354*width, y: 5.96697*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.3376*width, y: 5.73774*height), control1: CGPoint(x: 8.39961*width, y: 5.96296*height), control2: CGPoint(x: 8.37106*width, y: 5.86086*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.22835*width, y: 5.22422*height), control1: CGPoint(x: 8.27756*width, y: 5.51251*height), control2: CGPoint(x: 8.22835*width, y: 5.28128*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.19291*width, y: 5.15816*height), control1: CGPoint(x: 8.22835*width, y: 5.2012*height), control2: CGPoint(x: 8.2185*width, y: 5.18318*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.82776*width, y: 5.05706*height), control1: CGPoint(x: 8.11024*width, y: 5.07908*height), control2: CGPoint(x: 8.00984*width, y: 5.05105*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.69685*width, y: 5.05405*height), control1: CGPoint(x: 7.75591*width, y: 5.05906*height), control2: CGPoint(x: 7.69685*width, y: 5.05706*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.7628*width, y: 4.98599*height), control1: CGPoint(x: 7.69685*width, y: 5.05005*height), control2: CGPoint(x: 7.72638*width, y: 5.01902*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.14173*width, y: 4.83483*height), control1: CGPoint(x: 7.87008*width, y: 4.88488*height), control2: CGPoint(x: 7.99705*width, y: 4.83483*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.22244*width, y: 4.82282*height), control1: CGPoint(x: 8.19587*width, y: 4.83483*height), control2: CGPoint(x: 8.22047*width, y: 4.83083*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.24606*width, y: 4.67968*height), control1: CGPoint(x: 8.22441*width, y: 4.81582*height), control2: CGPoint(x: 8.23524*width, y: 4.75175*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.36713*width, y: 4.16416*height), control1: CGPoint(x: 8.27067*width, y: 4.52052*height), control2: CGPoint(x: 8.35433*width, y: 4.16416*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.37598*width, y: 4.14815*height), control1: CGPoint(x: 8.37205*width, y: 4.16416*height), control2: CGPoint(x: 8.37598*width, y: 4.15716*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.36713*width, y: 4.13814*height), control1: CGPoint(x: 8.37598*width, y: 4.14014*height), control2: CGPoint(x: 8.37205*width, y: 4.13514*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.96358*width, y: 3.72272*height), control1: CGPoint(x: 8.35925*width, y: 4.14314*height), control2: CGPoint(x: 8.04921*width, y: 3.82382*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.80315*width, y: 3.65365*height), control1: CGPoint(x: 7.92126*width, y: 3.67167*height), control2: CGPoint(x: 7.87795*width, y: 3.65365*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.45965*width, y: 3.77778*height), control1: CGPoint(x: 7.69882*width, y: 3.65365*height), control2: CGPoint(x: 7.57579*width, y: 3.6987*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.40551*width, y: 3.81081*height), control1: CGPoint(x: 7.4311*width, y: 3.7968*height), control2: CGPoint(x: 7.4065*width, y: 3.81181*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.45079*width, y: 3.66366*height), control1: CGPoint(x: 7.39764*width, y: 3.8038*height), control2: CGPoint(x: 7.4252*width, y: 3.71471*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.65354*width, y: 3.43143*height), control1: CGPoint(x: 7.49311*width, y: 3.57858*height), control2: CGPoint(x: 7.56988*width, y: 3.48949*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.72638*width, y: 3.37237*height), control1: CGPoint(x: 7.6939*width, y: 3.4024*height), control2: CGPoint(x: 7.72638*width, y: 3.37638*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.66929*width, y: 3.22222*height), control1: CGPoint(x: 7.72638*width, y: 3.36937*height), control2: CGPoint(x: 7.70079*width, y: 3.3013*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.53445*width, y: 2.84685*height), control1: CGPoint(x: 7.63878*width, y: 3.14314*height), control2: CGPoint(x: 7.57776*width, y: 2.97397*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.45669*width, y: 2.61461*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.27461*width, y: 2.56757*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.95965*width, y: 2.47648*height), control1: CGPoint(x: 7.17323*width, y: 2.54154*height), control2: CGPoint(x: 7.03248*width, y: 2.5005*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.81201*width, y: 2.43243*height), control1: CGPoint(x: 6.88681*width, y: 2.45245*height), control2: CGPoint(x: 6.81988*width, y: 2.43243*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.74409*width, y: 2.45946*height), control1: CGPoint(x: 6.80315*width, y: 2.43243*height), control2: CGPoint(x: 6.77264*width, y: 2.44444*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.51575*width, y: 2.72372*height), control1: CGPoint(x: 6.66437*width, y: 2.5005*height), control2: CGPoint(x: 6.5748*width, y: 2.6046*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.4626*width, y: 2.81381*height), control1: CGPoint(x: 6.48917*width, y: 2.77778*height), control2: CGPoint(x: 6.46555*width, y: 2.81882*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.42717*width, y: 2.6026*height), control1: CGPoint(x: 6.44587*width, y: 2.78579*height), control2: CGPoint(x: 6.42717*width, y: 2.67668*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.48622*width, y: 2.34234*height), control1: CGPoint(x: 6.42717*width, y: 2.5025*height), control2: CGPoint(x: 6.44488*width, y: 2.42643*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.51575*width, y: 2.27928*height), control1: CGPoint(x: 6.50197*width, y: 2.30931*height), control2: CGPoint(x: 6.51575*width, y: 2.28128*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.4498*width, y: 2.23023*height), control1: CGPoint(x: 6.51575*width, y: 2.27728*height), control2: CGPoint(x: 6.48622*width, y: 2.25526*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.93602*width, y: 1.78378*height), control1: CGPoint(x: 6.32874*width, y: 2.14815*height), control2: CGPoint(x: 6.22244*width, y: 2.05706*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.55807*width, y: 1.46647*height), control1: CGPoint(x: 5.75295*width, y: 1.61061*height), control2: CGPoint(x: 5.67126*width, y: 1.54254*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.99016*width, y: 1.3043*height), control1: CGPoint(x: 5.36909*width, y: 1.34134*height), control2: CGPoint(x: 5.20965*width, y: 1.2963*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.56102*width, y: 1.42042*height), control1: CGPoint(x: 4.82283*width, y: 1.31031*height), control2: CGPoint(x: 4.72539*width, y: 1.33734*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.43307*width, y: 1.48148*height), control1: CGPoint(x: 4.49606*width, y: 1.45445*height), control2: CGPoint(x: 4.43898*width, y: 1.48148*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.21555*width, y: 1.43043*height), control1: CGPoint(x: 4.42815*width, y: 1.48148*height), control2: CGPoint(x: 4.33071*width, y: 1.45846*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 4.00689*width, y: 1.37838*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 4.06102*width, y: 1.33433*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.77362*width, y: 0.97197*height), control1: CGPoint(x: 4.28248*width, y: 1.15115*height), control2: CGPoint(x: 4.5374*width, y: 1.02102*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.88091*width, y: 0.93694*height), control1: CGPoint(x: 4.82283*width, y: 0.96196*height), control2: CGPoint(x: 4.87106*width, y: 0.94595*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.97441*width, y: 0.72873*height), control1: CGPoint(x: 4.91437*width, y: 0.90591*height), control2: CGPoint(x: 4.95866*width, y: 0.80681*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.9813*width, y: 0.48048*height), control1: CGPoint(x: 4.99114*width, y: 0.64565*height), control2: CGPoint(x: 4.99311*width, y: 0.56757*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.97638*width, y: 0.42142*height), control1: CGPoint(x: 4.97638*width, y: 0.45045*height), control2: CGPoint(x: 4.97441*width, y: 0.42342*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.04331*width, y: 0.48348*height), control1: CGPoint(x: 4.97835*width, y: 0.41942*height), control2: CGPoint(x: 5.00787*width, y: 0.44745*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.19291*width, y: 0.78078*height), control1: CGPoint(x: 5.12303*width, y: 0.56657*height), control2: CGPoint(x: 5.17224*width, y: 0.66466*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.20472*width, y: 0.90991*height), control1: CGPoint(x: 5.20079*width, y: 0.82783*height), control2: CGPoint(x: 5.20669*width, y: 0.88589*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.20276*width, y: 0.95395*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.3002*width, y: 0.97698*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.03346*width, y: 1.4024*height), control1: CGPoint(x: 5.56004*width, y: 1.03604*height), control2: CGPoint(x: 5.81594*width, y: 1.18418*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.44291*width, y: 1.77878*height), control1: CGPoint(x: 6.12205*width, y: 1.49049*height), control2: CGPoint(x: 6.31496*width, y: 1.66867*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.15551*width, y: 2.16817*height), control1: CGPoint(x: 6.68406*width, y: 1.98799*height), control2: CGPoint(x: 6.85138*width, y: 2.07908*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.29331*width, y: 2.21622*height), control1: CGPoint(x: 7.22343*width, y: 2.18819*height), control2: CGPoint(x: 7.28543*width, y: 2.21021*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.27461*width, y: 2.16717*height), control1: CGPoint(x: 7.30118*width, y: 2.22222*height), control2: CGPoint(x: 7.29232*width, y: 2.2002*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.68504*width, y: 1.68969*height), control1: CGPoint(x: 7.13681*width, y: 1.91391*height), control2: CGPoint(x: 6.9498*width, y: 1.76276*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.46358*width, y: 1.66667*height), control1: CGPoint(x: 6.62598*width, y: 1.67367*height), control2: CGPoint(x: 6.57677*width, y: 1.66867*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 6.31693*width, y: 1.66466*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 6.17815*width, y: 1.52853*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.04921*width, y: 1.38138*height), control1: CGPoint(x: 6.07677*width, y: 1.43043*height), control2: CGPoint(x: 6.04134*width, y: 1.38939*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.44193*width, y: 1.32833*height), control1: CGPoint(x: 6.07283*width, y: 1.35736*height), control2: CGPoint(x: 6.28051*width, y: 1.32933*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.90256*width, y: 1.4024*height), control1: CGPoint(x: 6.63091*width, y: 1.32833*height), control2: CGPoint(x: 6.73524*width, y: 1.34535*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.06201*width, y: 1.43143*height), control1: CGPoint(x: 7.0128*width, y: 1.44044*height), control2: CGPoint(x: 7.02559*width, y: 1.44244*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.34449*width, y: 1.17117*height), control1: CGPoint(x: 7.15551*width, y: 1.4034*height), control2: CGPoint(x: 7.26476*width, y: 1.3033*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.3937*width, y: 1.1011*height), control1: CGPoint(x: 7.36713*width, y: 1.13313*height), control2: CGPoint(x: 7.38976*width, y: 1.1011*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.40945*width, y: 1.29329*height), control1: CGPoint(x: 7.4065*width, y: 1.1011*height), control2: CGPoint(x: 7.41339*width, y: 1.19019*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.37402*width, y: 1.46647*height), control1: CGPoint(x: 7.4065*width, y: 1.38438*height), control2: CGPoint(x: 7.40256*width, y: 1.4044*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.31398*width, y: 1.58258*height), control1: CGPoint(x: 7.3563*width, y: 1.5045*height), control2: CGPoint(x: 7.32874*width, y: 1.55656*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.28543*width, y: 1.62863*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.36909*width, y: 1.72172*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.77756*width, y: 2.52553*height), control1: CGPoint(x: 7.53937*width, y: 1.91391*height), control2: CGPoint(x: 7.63878*width, y: 2.10811*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.83071*width, y: 2.66967*height), control1: CGPoint(x: 7.80512*width, y: 2.60661*height), control2: CGPoint(x: 7.82874*width, y: 2.67167*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.78051*width, y: 2.4995*height), control1: CGPoint(x: 7.83366*width, y: 2.66767*height), control2: CGPoint(x: 7.81102*width, y: 2.59059*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.72638*width, y: 2.32833*height), control1: CGPoint(x: 7.75098*width, y: 2.40741*height), control2: CGPoint(x: 7.72638*width, y: 2.33033*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.03543*width, y: 2.44144*height), control1: CGPoint(x: 7.72638*width, y: 2.32032*height), control2: CGPoint(x: 7.95669*width, y: 2.4044*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.48031*width, y: 2.77077*height), control1: CGPoint(x: 8.20079*width, y: 2.51752*height), control2: CGPoint(x: 8.38386*width, y: 2.65365*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.53839*width, y: 2.84084*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.59843*width, y: 2.84184*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.70177*width, y: 2.82983*height), control1: CGPoint(x: 8.63091*width, y: 2.84284*height), control2: CGPoint(x: 8.67815*width, y: 2.83684*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.93898*width, y: 2.6997*height), control1: CGPoint(x: 8.77264*width, y: 2.80781*height), control2: CGPoint(x: 8.87598*width, y: 2.75075*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 9.00197*width, y: 2.65465*height), control1: CGPoint(x: 8.97146*width, y: 2.67267*height), control2: CGPoint(x: 9*width, y: 2.65265*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.94488*width, y: 2.86086*height), control1: CGPoint(x: 9.01083*width, y: 2.66466*height), control2: CGPoint(x: 8.97343*width, y: 2.8018*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.74902*width, y: 3.08408*height), control1: CGPoint(x: 8.90748*width, y: 2.93794*height), control2: CGPoint(x: 8.81988*width, y: 3.03704*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.70669*width, y: 3.13213*height), control1: CGPoint(x: 8.7126*width, y: 3.10711*height), control2: CGPoint(x: 8.70177*width, y: 3.12012*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.77559*width, y: 3.38639*height), control1: CGPoint(x: 8.72933*width, y: 3.18819*height), control2: CGPoint(x: 8.7628*width, y: 3.30831*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.78642*width, y: 3.65866*height), control1: CGPoint(x: 8.7874*width, y: 3.45646*height), control2: CGPoint(x: 8.79035*width, y: 3.52052*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.67618*width, y: 4.33133*height), control1: CGPoint(x: 8.78051*width, y: 3.86887*height), control2: CGPoint(x: 8.76772*width, y: 3.94995*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.56594*width, y: 4.95996*height), control1: CGPoint(x: 8.58661*width, y: 4.7047*height), control2: CGPoint(x: 8.57185*width, y: 4.78679*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.62697*width, y: 5.47047*height), control1: CGPoint(x: 8.56004*width, y: 5.13614*height), control2: CGPoint(x: 8.57382*width, y: 5.25626*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.65748*width, y: 5.63063*height), control1: CGPoint(x: 8.64665*width, y: 5.54755*height), control2: CGPoint(x: 8.66043*width, y: 5.61962*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.65256*width, y: 5.65065*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.66732*width, y: 5.63063*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.81102*width, y: 5.30531*height), control1: CGPoint(x: 8.70177*width, y: 5.58559*height), control2: CGPoint(x: 8.79035*width, y: 5.38438*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.83268*width, y: 5.04505*height), control1: CGPoint(x: 8.83071*width, y: 5.23123*height), control2: CGPoint(x: 8.83366*width, y: 5.1972*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.80512*width, y: 4.78478*height), control1: CGPoint(x: 8.83268*width, y: 4.87988*height), control2: CGPoint(x: 8.83071*width, y: 4.86486*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.69291*width, y: 4.54454*height), control1: CGPoint(x: 8.77362*width, y: 4.68969*height), control2: CGPoint(x: 8.74409*width, y: 4.62663*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.65846*width, y: 4.49049*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.70669*width, y: 4.28729*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.75886*width, y: 4.08408*height), control1: CGPoint(x: 8.73228*width, y: 4.17518*height), control2: CGPoint(x: 8.75591*width, y: 4.08408*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.95374*width, y: 4.33634*height), control1: CGPoint(x: 8.7687*width, y: 4.08408*height), control2: CGPoint(x: 8.89764*width, y: 4.25025*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 9.1378*width, y: 4.72973*height), control1: CGPoint(x: 9.03346*width, y: 4.45746*height), control2: CGPoint(x: 9.08268*width, y: 4.56156*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 9.23031*width, y: 4.91191*height), control1: CGPoint(x: 9.18504*width, y: 4.87087*height), control2: CGPoint(x: 9.18996*width, y: 4.88088*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 9.55413*width, y: 4.98999*height), control1: CGPoint(x: 9.30413*width, y: 4.96897*height), control2: CGPoint(x: 9.39173*width, y: 4.98999*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 9.6939*width, y: 4.98999*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 9.64272*width, y: 5.04304*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 9.24213*width, y: 5.2032*height), control1: CGPoint(x: 9.5502*width, y: 5.13914*height), control2: CGPoint(x: 9.37106*width, y: 5.21121*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 9.17618*width, y: 5.2002*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 9.15453*width, y: 5.3003*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.90748*width, y: 5.87487*height), control1: CGPoint(x: 9.1122*width, y: 5.48849*height), control2: CGPoint(x: 9.02362*width, y: 5.69469*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.59252*width, y: 6.28629*height), control1: CGPoint(x: 8.83661*width, y: 5.98398*height), control2: CGPoint(x: 8.78937*width, y: 6.04605*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.04528*width, y: 7.14114*height), control1: CGPoint(x: 8.25197*width, y: 6.7007*height), control2: CGPoint(x: 8.16732*width, y: 6.83283*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.92421*width, y: 7.34535*height), control1: CGPoint(x: 7.9685*width, y: 7.33333*height), control2: CGPoint(x: 7.97441*width, y: 7.32432*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.77854*width, y: 7.3984*height), control1: CGPoint(x: 7.89961*width, y: 7.35636*height), control2: CGPoint(x: 7.83366*width, y: 7.38038*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.68209*width, y: 7.43544*height), control1: CGPoint(x: 7.72343*width, y: 7.41642*height), control2: CGPoint(x: 7.68012*width, y: 7.43343*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.94488*width, y: 7.34635*height), control1: CGPoint(x: 7.68799*width, y: 7.44144*height), control2: CGPoint(x: 7.90059*width, y: 7.36937*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.98917*width, y: 7.31431*height), control1: CGPoint(x: 7.96457*width, y: 7.33634*height), control2: CGPoint(x: 7.98524*width, y: 7.32132*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.07677*width, y: 7.25325*height), control1: CGPoint(x: 7.99311*width, y: 7.30731*height), control2: CGPoint(x: 8.03346*width, y: 7.28028*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.41535*width, y: 6.88188*height), control1: CGPoint(x: 8.22933*width, y: 7.16116*height), control2: CGPoint(x: 8.3435*width, y: 7.03504*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.49114*width, y: 6.54254*height), control1: CGPoint(x: 8.46654*width, y: 6.77177*height), control2: CGPoint(x: 8.48425*width, y: 6.69369*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.49705*width, y: 6.41441*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 8.61122*width, y: 6.27728*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.75197*width, y: 6.10611*height), control1: CGPoint(x: 8.67421*width, y: 6.2022*height), control2: CGPoint(x: 8.7372*width, y: 6.12513*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.78346*width, y: 6.07708*height), control1: CGPoint(x: 8.76673*width, y: 6.08709*height), control2: CGPoint(x: 8.78051*width, y: 6.07407*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.83563*width, y: 6.47147*height), control1: CGPoint(x: 8.79823*width, y: 6.09209*height), control2: CGPoint(x: 8.83071*width, y: 6.33934*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.72933*width, y: 7.04404*height), control1: CGPoint(x: 8.84252*width, y: 6.68569*height), control2: CGPoint(x: 8.81594*width, y: 6.82983*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.73327*width, y: 7.13013*height), control1: CGPoint(x: 8.7185*width, y: 7.07107*height), control2: CGPoint(x: 8.7185*width, y: 7.08408*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 9.02067*width, y: 7.43343*height), control1: CGPoint(x: 8.76772*width, y: 7.24024*height), control2: CGPoint(x: 8.87106*width, y: 7.35035*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 9.08858*width, y: 7.47147*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 9.04528*width, y: 7.48549*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.74016*width, y: 7.47848*height), control1: CGPoint(x: 8.97539*width, y: 7.50751*height), control2: CGPoint(x: 8.81693*width, y: 7.5035*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.53937*width, y: 7.36737*height), control1: CGPoint(x: 8.6752*width, y: 7.45746*height), control2: CGPoint(x: 8.57283*width, y: 7.4014*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.44783*width, y: 7.41441*height), control1: CGPoint(x: 8.52165*width, y: 7.34935*height), control2: CGPoint(x: 8.5187*width, y: 7.35035*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.57776*width, y: 7.80781*height), control1: CGPoint(x: 8.24114*width, y: 7.5976*height), control2: CGPoint(x: 8.01181*width, y: 7.7007*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.83957*width, y: 8.03904*height), control1: CGPoint(x: 7.12205*width, y: 7.91992*height), control2: CGPoint(x: 6.99114*width, y: 7.96096*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.43602*width, y: 8.32933*height), control1: CGPoint(x: 6.7126*width, y: 8.1031*height), control2: CGPoint(x: 6.59449*width, y: 8.18919*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.32776*width, y: 8.39139*height), control1: CGPoint(x: 6.38287*width, y: 8.37738*height), control2: CGPoint(x: 6.36417*width, y: 8.38739*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.46654*width, y: 8.39339*height), control1: CGPoint(x: 6.30413*width, y: 8.39439*height), control2: CGPoint(x: 6.36614*width, y: 8.3954*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.74606*width, y: 8.36436*height), control1: CGPoint(x: 6.62598*width, y: 8.39139*height), control2: CGPoint(x: 6.66043*width, y: 8.38739*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.1939*width, y: 8.11411*height), control1: CGPoint(x: 6.9065*width, y: 8.32232*height), control2: CGPoint(x: 7.07382*width, y: 8.22823*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.30118*width, y: 7.99299*height), control1: CGPoint(x: 7.21161*width, y: 8.0971*height), control2: CGPoint(x: 7.25984*width, y: 8.04304*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.39764*width, y: 7.89089*height), control1: CGPoint(x: 7.34154*width, y: 7.94394*height), control2: CGPoint(x: 7.38484*width, y: 7.8969*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.76969*width, y: 7.79379*height), control1: CGPoint(x: 7.41831*width, y: 7.87888*height), control2: CGPoint(x: 7.68799*width, y: 7.80881*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.80709*width, y: 7.78679*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.74606*width, y: 7.9049*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.42815*width, y: 8.35235*height), control1: CGPoint(x: 7.6437*width, y: 8.1041*height), control2: CGPoint(x: 7.5689*width, y: 8.21021*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.30118*width, y: 8.48148*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.30512*width, y: 8.56256*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.42618*width, y: 8.87487*height), control1: CGPoint(x: 7.31102*width, y: 8.66266*height), control2: CGPoint(x: 7.34941*width, y: 8.76176*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.47638*width, y: 8.95596*height), control1: CGPoint(x: 7.45571*width, y: 8.91792*height), control2: CGPoint(x: 7.47835*width, y: 8.95395*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.40551*width, y: 8.93794*height), control1: CGPoint(x: 7.47539*width, y: 8.95796*height), control2: CGPoint(x: 7.44291*width, y: 8.94995*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.04724*width, y: 8.65065*height), control1: CGPoint(x: 7.24409*width, y: 8.88689*height), control2: CGPoint(x: 7.1565*width, y: 8.81682*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 7.03248*width, y: 8.62763*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 6.95276*width, y: 8.65766*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.49114*width, y: 8.73574*height), control1: CGPoint(x: 6.82185*width, y: 8.70671*height), control2: CGPoint(x: 6.68012*width, y: 8.73073*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.9065*width, y: 8.67367*height), control1: CGPoint(x: 6.3002*width, y: 8.74174*height), control2: CGPoint(x: 6.19291*width, y: 8.72973*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.72244*width, y: 8.64164*height), control1: CGPoint(x: 5.80709*width, y: 8.65365*height), control2: CGPoint(x: 5.72441*width, y: 8.63964*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.85827*width, y: 8.67367*height), control1: CGPoint(x: 5.71949*width, y: 8.64364*height), control2: CGPoint(x: 5.7815*width, y: 8.65866*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.01083*width, y: 8.70771*height), control1: CGPoint(x: 5.93602*width, y: 8.68869*height), control2: CGPoint(x: 6.00394*width, y: 8.7047*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.81201*width, y: 8.88088*height), control1: CGPoint(x: 6.02264*width, y: 8.71371*height), control2: CGPoint(x: 5.92421*width, y: 8.7998*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.31004*width, y: 9.11411*height), control1: CGPoint(x: 5.66929*width, y: 8.98398*height), control2: CGPoint(x: 5.46161*width, y: 9.08108*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.19783*width, y: 9.16817*height), control1: CGPoint(x: 5.24409*width, y: 9.12913*height), control2: CGPoint(x: 5.22638*width, y: 9.13814*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.10039*width, y: 9.54655*height), control1: CGPoint(x: 5.12106*width, y: 9.24925*height), control2: CGPoint(x: 5.09449*width, y: 9.35636*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.10335*width, y: 9.67968*height), control1: CGPoint(x: 5.10335*width, y: 9.61962*height), control2: CGPoint(x: 5.10433*width, y: 9.67968*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.05217*width, y: 9.63163*height), control1: CGPoint(x: 5.10236*width, y: 9.67968*height), control2: CGPoint(x: 5.07972*width, y: 9.65766*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 5.70177*width, y: 8.63163*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.67717*width, y: 8.63163*height), control1: CGPoint(x: 5.69488*width, y: 8.62963*height), control2: CGPoint(x: 5.68307*width, y: 8.62963*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.68898*width, y: 8.63664*height), control1: CGPoint(x: 5.67028*width, y: 8.63463*height), control2: CGPoint(x: 5.6752*width, y: 8.63664*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.70177*width, y: 8.63163*height), control1: CGPoint(x: 5.70276*width, y: 8.63664*height), control2: CGPoint(x: 5.70768*width, y: 8.63463*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 5.65256*width, y: 8.62162*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.62795*width, y: 8.62162*height), control1: CGPoint(x: 5.64567*width, y: 8.61962*height), control2: CGPoint(x: 5.63386*width, y: 8.61962*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.63976*width, y: 8.62663*height), control1: CGPoint(x: 5.62106*width, y: 8.62462*height), control2: CGPoint(x: 5.62598*width, y: 8.62663*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.65256*width, y: 8.62162*height), control1: CGPoint(x: 5.65354*width, y: 8.62663*height), control2: CGPoint(x: 5.65846*width, y: 8.62462*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 6.25295*width, y: 8.38138*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.22835*width, y: 8.38138*height), control1: CGPoint(x: 6.24606*width, y: 8.37938*height), control2: CGPoint(x: 6.23425*width, y: 8.37938*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.24016*width, y: 8.38639*height), control1: CGPoint(x: 6.22146*width, y: 8.38438*height), control2: CGPoint(x: 6.22638*width, y: 8.38639*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 6.25295*width, y: 8.38138*height), control1: CGPoint(x: 6.25394*width, y: 8.38639*height), control2: CGPoint(x: 6.25886*width, y: 8.38438*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 2.75689*width, y: 7.78078*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.75197*width, y: 7.79279*height), control1: CGPoint(x: 2.74508*width, y: 7.76076*height), control2: CGPoint(x: 2.74311*width, y: 7.76677*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.7628*width, y: 7.8038*height), control1: CGPoint(x: 2.75591*width, y: 7.8018*height), control2: CGPoint(x: 2.76083*width, y: 7.80681*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.75689*width, y: 7.78078*height), control1: CGPoint(x: 2.76575*width, y: 7.8018*height), control2: CGPoint(x: 2.7628*width, y: 7.79079*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.38484*width, y: 5.94394*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.37894*width, y: 5.94995*height), control1: CGPoint(x: 1.38189*width, y: 5.93594*height), control2: CGPoint(x: 1.37894*width, y: 5.93894*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.38386*width, y: 5.96296*height), control1: CGPoint(x: 1.37795*width, y: 5.96096*height), control2: CGPoint(x: 1.38091*width, y: 5.96697*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.38484*width, y: 5.94394*height), control1: CGPoint(x: 1.38681*width, y: 5.95996*height), control2: CGPoint(x: 1.3878*width, y: 5.95095*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.39469*width, y: 5.89389*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.38976*width, y: 5.90591*height), control1: CGPoint(x: 1.39173*width, y: 5.88689*height), control2: CGPoint(x: 1.38976*width, y: 5.89189*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.39469*width, y: 5.91892*height), control1: CGPoint(x: 1.38976*width, y: 5.91992*height), control2: CGPoint(x: 1.39173*width, y: 5.92492*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.39469*width, y: 5.89389*height), control1: CGPoint(x: 1.39665*width, y: 5.91191*height), control2: CGPoint(x: 1.39665*width, y: 5.8999*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.46949*width, y: 5.90591*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.48228*width, y: 5.88589*height), control1: CGPoint(x: 8.47933*width, y: 5.89489*height), control2: CGPoint(x: 8.48524*width, y: 5.88589*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.45965*width, y: 5.90591*height), control1: CGPoint(x: 8.47933*width, y: 5.88589*height), control2: CGPoint(x: 8.46949*width, y: 5.89489*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.44685*width, y: 5.92593*height), control1: CGPoint(x: 8.4498*width, y: 5.91692*height), control2: CGPoint(x: 8.4439*width, y: 5.92593*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.46949*width, y: 5.90591*height), control1: CGPoint(x: 8.4498*width, y: 5.92593*height), control2: CGPoint(x: 8.45965*width, y: 5.91692*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.40453*width, y: 5.85385*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.39862*width, y: 5.85986*height), control1: CGPoint(x: 1.40157*width, y: 5.84585*height), control2: CGPoint(x: 1.39862*width, y: 5.84885*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.40354*width, y: 5.87287*height), control1: CGPoint(x: 1.39764*width, y: 5.87087*height), control2: CGPoint(x: 1.40059*width, y: 5.87688*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.40453*width, y: 5.85385*height), control1: CGPoint(x: 1.4065*width, y: 5.86987*height), control2: CGPoint(x: 1.40748*width, y: 5.86086*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.51476*width, y: 5.84885*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.51181*width, y: 5.84484*height), control1: CGPoint(x: 8.52756*width, y: 5.83283*height), control2: CGPoint(x: 8.52657*width, y: 5.83183*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.49409*width, y: 5.86186*height), control1: CGPoint(x: 8.50197*width, y: 5.85185*height), control2: CGPoint(x: 8.49409*width, y: 5.85986*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.51476*width, y: 5.84885*height), control1: CGPoint(x: 8.49409*width, y: 5.86987*height), control2: CGPoint(x: 8.50197*width, y: 5.86486*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.41437*width, y: 5.8038*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.40846*width, y: 5.80981*height), control1: CGPoint(x: 1.41142*width, y: 5.7958*height), control2: CGPoint(x: 1.40846*width, y: 5.7988*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.41339*width, y: 5.82282*height), control1: CGPoint(x: 1.40748*width, y: 5.82082*height), control2: CGPoint(x: 1.41043*width, y: 5.82683*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.41437*width, y: 5.8038*height), control1: CGPoint(x: 1.41634*width, y: 5.81982*height), control2: CGPoint(x: 1.41732*width, y: 5.81081*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.42421*width, y: 5.75375*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.41929*width, y: 5.76577*height), control1: CGPoint(x: 1.42126*width, y: 5.74675*height), control2: CGPoint(x: 1.41929*width, y: 5.75175*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.42421*width, y: 5.77878*height), control1: CGPoint(x: 1.41929*width, y: 5.77978*height), control2: CGPoint(x: 1.42126*width, y: 5.78478*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.42421*width, y: 5.75375*height), control1: CGPoint(x: 1.42618*width, y: 5.77177*height), control2: CGPoint(x: 1.42618*width, y: 5.75976*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.44587*width, y: 5.67668*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.44685*width, y: 5.64164*height), control1: CGPoint(x: 1.45079*width, y: 5.65265*height), control2: CGPoint(x: 1.45177*width, y: 5.63764*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.43307*width, y: 5.6957*height), control1: CGPoint(x: 1.44291*width, y: 5.64665*height), control2: CGPoint(x: 1.43602*width, y: 5.67067*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.44587*width, y: 5.67668*height), control1: CGPoint(x: 1.42618*width, y: 5.74875*height), control2: CGPoint(x: 1.43209*width, y: 5.73974*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.46949*width, y: 5.5005*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.47441*width, y: 4.5996*height), control1: CGPoint(x: 1.54528*width, y: 5.13814*height), control2: CGPoint(x: 1.54626*width, y: 4.91291*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.44685*width, y: 4.4955*height), control1: CGPoint(x: 1.46358*width, y: 4.55055*height), control2: CGPoint(x: 1.45079*width, y: 4.5035*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.31398*width, y: 4.67968*height), control1: CGPoint(x: 1.43701*width, y: 4.47648*height), control2: CGPoint(x: 1.36024*width, y: 4.58358*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.24311*width, y: 5.01602*height), control1: CGPoint(x: 1.2628*width, y: 4.78579*height), control2: CGPoint(x: 1.24803*width, y: 4.85285*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.3189*width, y: 5.41241*height), control1: CGPoint(x: 1.2372*width, y: 5.18719*height), control2: CGPoint(x: 1.25197*width, y: 5.26827*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.44193*width, y: 5.62362*height), control1: CGPoint(x: 1.3563*width, y: 5.49349*height), control2: CGPoint(x: 1.43602*width, y: 5.62963*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.46949*width, y: 5.5005*height), control1: CGPoint(x: 1.4439*width, y: 5.62162*height), control2: CGPoint(x: 1.45669*width, y: 5.56657*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.4813*width, y: 4.44444*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.49409*width, y: 4.42442*height), control1: CGPoint(x: 1.49114*width, y: 4.43343*height), control2: CGPoint(x: 1.49705*width, y: 4.42442*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.47146*width, y: 4.44444*height), control1: CGPoint(x: 1.49114*width, y: 4.42442*height), control2: CGPoint(x: 1.4813*width, y: 4.43343*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.45866*width, y: 4.46446*height), control1: CGPoint(x: 1.46161*width, y: 4.45546*height), control2: CGPoint(x: 1.45571*width, y: 4.46446*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.4813*width, y: 4.44444*height), control1: CGPoint(x: 1.46161*width, y: 4.46446*height), control2: CGPoint(x: 1.47146*width, y: 4.45546*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.38287*width, y: 4.1021*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.37697*width, y: 4.10811*height), control1: CGPoint(x: 8.37992*width, y: 4.09409*height), control2: CGPoint(x: 8.37697*width, y: 4.0971*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.38189*width, y: 4.12112*height), control1: CGPoint(x: 8.37598*width, y: 4.11912*height), control2: CGPoint(x: 8.37894*width, y: 4.12513*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.38287*width, y: 4.1021*height), control1: CGPoint(x: 8.38484*width, y: 4.11812*height), control2: CGPoint(x: 8.38583*width, y: 4.10911*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.39272*width, y: 4.06206*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.38681*width, y: 4.06807*height), control1: CGPoint(x: 8.38976*width, y: 4.05405*height), control2: CGPoint(x: 8.38681*width, y: 4.05706*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.39173*width, y: 4.08108*height), control1: CGPoint(x: 8.38583*width, y: 4.07908*height), control2: CGPoint(x: 8.38878*width, y: 4.08509*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.39272*width, y: 4.06206*height), control1: CGPoint(x: 8.39469*width, y: 4.07808*height), control2: CGPoint(x: 8.39567*width, y: 4.06907*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.40256*width, y: 4.01201*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.39764*width, y: 4.02402*height), control1: CGPoint(x: 8.39961*width, y: 4.00501*height), control2: CGPoint(x: 8.39764*width, y: 4.01001*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.40256*width, y: 4.03704*height), control1: CGPoint(x: 8.39764*width, y: 4.03804*height), control2: CGPoint(x: 8.39961*width, y: 4.04304*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.40256*width, y: 4.01201*height), control1: CGPoint(x: 8.40453*width, y: 4.03003*height), control2: CGPoint(x: 8.40453*width, y: 4.01802*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.43406*width, y: 3.85385*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.42028*width, y: 3.89389*height), control1: CGPoint(x: 8.43307*width, y: 3.83984*height), control2: CGPoint(x: 8.42717*width, y: 3.85786*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.42126*width, y: 3.93894*height), control1: CGPoint(x: 8.40256*width, y: 3.97898*height), control2: CGPoint(x: 8.40354*width, y: 4.01702*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.43406*width, y: 3.85385*height), control1: CGPoint(x: 8.42815*width, y: 3.90591*height), control2: CGPoint(x: 8.43406*width, y: 3.86787*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.44193*width, y: 3.78679*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.43701*width, y: 3.7988*height), control1: CGPoint(x: 8.43898*width, y: 3.77678*height), control2: CGPoint(x: 8.43701*width, y: 3.78278*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.44193*width, y: 3.81682*height), control1: CGPoint(x: 8.43701*width, y: 3.81582*height), control2: CGPoint(x: 8.43898*width, y: 3.82282*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.44193*width, y: 3.78679*height), control1: CGPoint(x: 8.4439*width, y: 3.80981*height), control2: CGPoint(x: 8.4439*width, y: 3.7958*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 8.44193*width, y: 3.57357*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.37106*width, y: 3.23724*height), control1: CGPoint(x: 8.43602*width, y: 3.42342*height), control2: CGPoint(x: 8.42028*width, y: 3.34535*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.93504*width, y: 2.78478*height), control1: CGPoint(x: 8.28445*width, y: 3.04304*height), control2: CGPoint(x: 8.1378*width, y: 2.89189*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.85433*width, y: 2.74575*height), control1: CGPoint(x: 7.89075*width, y: 2.76076*height), control2: CGPoint(x: 7.85433*width, y: 2.74374*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 7.9626*width, y: 3.05906*height), control1: CGPoint(x: 7.85433*width, y: 2.75576*height), control2: CGPoint(x: 7.93406*width, y: 2.98398*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.375*width, y: 3.67668*height), control1: CGPoint(x: 8.05217*width, y: 3.28629*height), control2: CGPoint(x: 8.16732*width, y: 3.46046*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.4439*width, y: 3.72673*height), control1: CGPoint(x: 8.4252*width, y: 3.72873*height), control2: CGPoint(x: 8.44094*width, y: 3.74074*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 8.44193*width, y: 3.57357*height), control1: CGPoint(x: 8.44587*width, y: 3.71672*height), control2: CGPoint(x: 8.44488*width, y: 3.64765*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 1.3248*width, y: 4.003*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.35433*width, y: 3.14014*height), control1: CGPoint(x: 1.25197*width, y: 3.67968*height), control2: CGPoint(x: 1.2628*width, y: 3.37437*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.37795*width, y: 3.002*height), control1: CGPoint(x: 1.3878*width, y: 3.05606*height), control2: CGPoint(x: 1.38878*width, y: 3.04905*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.1063*width, y: 2.69469*height), control1: CGPoint(x: 1.35236*width, y: 2.89289*height), control2: CGPoint(x: 1.25787*width, y: 2.78679*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.02362*width, y: 2.64464*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.05512*width, y: 2.63263*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.32283*width, y: 2.62663*height), control1: CGPoint(x: 1.11319*width, y: 2.61161*height), control2: CGPoint(x: 1.24803*width, y: 2.60861*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.54626*width, y: 2.73273*height), control1: CGPoint(x: 1.40157*width, y: 2.64565*height), control2: CGPoint(x: 1.49803*width, y: 2.69169*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.57972*width, y: 2.75976*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.65551*width, y: 2.68869*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.97835*width, y: 2.45445*height), control1: CGPoint(x: 1.75394*width, y: 2.5956*height), control2: CGPoint(x: 1.86122*width, y: 2.51752*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.28248*width, y: 2.33033*height), control1: CGPoint(x: 2.09449*width, y: 2.39139*height), control2: CGPoint(x: 2.27461*width, y: 2.31832*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.35236*width, y: 2.31632*height), control1: CGPoint(x: 2.28543*width, y: 2.33534*height), control2: CGPoint(x: 2.31594*width, y: 2.32933*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.34843*width, y: 2.30731*height), control1: CGPoint(x: 2.42421*width, y: 2.29129*height), control2: CGPoint(x: 2.42224*width, y: 2.28428*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.29724*width, y: 2.31932*height), control1: CGPoint(x: 2.32185*width, y: 2.31532*height), control2: CGPoint(x: 2.29823*width, y: 2.32132*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.42126*width, y: 1.98198*height), control1: CGPoint(x: 2.28937*width, y: 2.31131*height), control2: CGPoint(x: 2.37894*width, y: 2.06707*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.65059*width, y: 1.65566*height), control1: CGPoint(x: 2.48228*width, y: 1.85886*height), control2: CGPoint(x: 2.54626*width, y: 1.76877*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.74508*width, y: 1.53854*height), control1: CGPoint(x: 2.69783*width, y: 1.60561*height), control2: CGPoint(x: 2.74016*width, y: 1.55255*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.71063*width, y: 1.32733*height), control1: CGPoint(x: 2.75886*width, y: 1.5035*height), control2: CGPoint(x: 2.74213*width, y: 1.40541*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.62795*width, y: 1.17918*height), control1: CGPoint(x: 2.69685*width, y: 1.29429*height), control2: CGPoint(x: 2.65945*width, y: 1.22723*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.57677*width, y: 1.09109*height), control1: CGPoint(x: 2.59547*width, y: 1.13013*height), control2: CGPoint(x: 2.57283*width, y: 1.09109*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.7687*width, y: 1.15816*height), control1: CGPoint(x: 2.6063*width, y: 1.09109*height), control2: CGPoint(x: 2.71161*width, y: 1.12813*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.97047*width, y: 1.34935*height), control1: CGPoint(x: 2.84843*width, y: 1.2012*height), control2: CGPoint(x: 2.9124*width, y: 1.26126*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.02067*width, y: 1.41141*height), control1: CGPoint(x: 2.99409*width, y: 1.38338*height), control2: CGPoint(x: 3.01575*width, y: 1.41141*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.08465*width, y: 1.39139*height), control1: CGPoint(x: 3.02461*width, y: 1.41141*height), control2: CGPoint(x: 3.05413*width, y: 1.4024*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.46063*width, y: 1.33433*height), control1: CGPoint(x: 3.18307*width, y: 1.35736*height), control2: CGPoint(x: 3.29724*width, y: 1.33934*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.32087*width, y: 1.46647*height), control1: CGPoint(x: 3.70177*width, y: 1.32533*height), control2: CGPoint(x: 3.77362*width, y: 1.33734*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.00787*width, y: 1.58158*height), control1: CGPoint(x: 4.7815*width, y: 1.57558*height), control2: CGPoint(x: 4.81594*width, y: 1.58158*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.43307*width, y: 1.54054*height), control1: CGPoint(x: 5.18799*width, y: 1.58158*height), control2: CGPoint(x: 5.28937*width, y: 1.57157*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.66437*width, y: 1.56857*height), control1: CGPoint(x: 5.5935*width, y: 1.5045*height), control2: CGPoint(x: 5.57776*width, y: 1.5025*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.81594*width, y: 1.6987*height), control1: CGPoint(x: 5.70768*width, y: 1.6016*height), control2: CGPoint(x: 5.77559*width, y: 1.65966*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.88976*width, y: 1.76877*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.77657*width, y: 1.7998*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.47736*width, y: 1.87387*height), control1: CGPoint(x: 5.71457*width, y: 1.81782*height), control2: CGPoint(x: 5.58071*width, y: 1.85085*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.25098*width, y: 1.92392*height), control1: CGPoint(x: 5.375*width, y: 1.8959*height), control2: CGPoint(x: 5.27264*width, y: 1.91892*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.16535*width, y: 1.98198*height), control1: CGPoint(x: 5.22343*width, y: 1.93093*height), control2: CGPoint(x: 5.19685*width, y: 1.94895*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 5.07185*width, y: 2.31031*height), control1: CGPoint(x: 5.10039*width, y: 2.05105*height), control2: CGPoint(x: 5.07972*width, y: 2.12412*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.06594*width, y: 2.45345*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 5.02559*width, y: 2.41341*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.86713*width, y: 2.02202*height), control1: CGPoint(x: 4.93012*width, y: 2.31832*height), control2: CGPoint(x: 4.87106*width, y: 2.17117*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 4.86516*width, y: 1.92693*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 4.81201*width, y: 1.91892*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 4.32677*width, y: 1.81582*height), control1: CGPoint(x: 4.70768*width, y: 1.9039*height), control2: CGPoint(x: 4.54921*width, y: 1.86987*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 4.10138*width, y: 1.76176*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 4.04724*width, y: 1.80881*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.89862*width, y: 1.93994*height), control1: CGPoint(x: 4.01772*width, y: 1.83584*height), control2: CGPoint(x: 3.95079*width, y: 1.89389*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.55413*width, y: 2.21221*height), control1: CGPoint(x: 3.81201*width, y: 2.01602*height), control2: CGPoint(x: 3.59055*width, y: 2.19119*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.54823*width, y: 2.41842*height), control1: CGPoint(x: 3.5315*width, y: 2.22523*height), control2: CGPoint(x: 3.52756*width, y: 2.34535*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.66732*width, y: 2.66066*height), control1: CGPoint(x: 3.5689*width, y: 2.49249*height), control2: CGPoint(x: 3.6122*width, y: 2.58058*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.68307*width, y: 2.71672*height), control1: CGPoint(x: 3.70965*width, y: 2.72272*height), control2: CGPoint(x: 3.70965*width, y: 2.72272*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.29232*width, y: 2.44144*height), control1: CGPoint(x: 3.50787*width, y: 2.67768*height), control2: CGPoint(x: 3.37697*width, y: 2.58559*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.25295*width, y: 2.37437*height), control1: CGPoint(x: 3.27165*width, y: 2.40641*height), control2: CGPoint(x: 3.25394*width, y: 2.37638*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.20768*width, y: 2.39039*height), control1: CGPoint(x: 3.25197*width, y: 2.37337*height), control2: CGPoint(x: 3.2313*width, y: 2.38038*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.70177*width, y: 2.55756*height), control1: CGPoint(x: 3.12894*width, y: 2.42442*height), control2: CGPoint(x: 2.96063*width, y: 2.48048*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.1624*width, y: 2.75475*height), control1: CGPoint(x: 2.39961*width, y: 2.64765*height), control2: CGPoint(x: 2.29331*width, y: 2.68769*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.70276*width, y: 3.21522*height), control1: CGPoint(x: 1.94587*width, y: 2.86787*height), control2: CGPoint(x: 1.79429*width, y: 3.01902*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.62894*width, y: 3.60961*height), control1: CGPoint(x: 1.63681*width, y: 3.35636*height), control2: CGPoint(x: 1.62992*width, y: 3.39439*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.62894*width, y: 3.8008*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.54035*width, y: 3.88388*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 1.39665*width, y: 4.02202*height), control1: CGPoint(x: 1.49114*width, y: 3.92993*height), control2: CGPoint(x: 1.42717*width, y: 3.99199*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.34055*width, y: 4.07608*height))
 | 
				
			||||||
 | 
					        path.addLine(to: CGPoint(x: 1.3248*width, y: 4.003*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 2.46555*width, y: 2.28228*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.47047*width, y: 2.27327*height), control1: CGPoint(x: 2.47835*width, y: 2.27728*height), control2: CGPoint(x: 2.47933*width, y: 2.27327*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.43602*width, y: 2.28228*height), control1: CGPoint(x: 2.4626*width, y: 2.27327*height), control2: CGPoint(x: 2.44685*width, y: 2.27728*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.4311*width, y: 2.29129*height), control1: CGPoint(x: 2.42323*width, y: 2.28729*height), control2: CGPoint(x: 2.42224*width, y: 2.29129*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.46555*width, y: 2.28228*height), control1: CGPoint(x: 2.43898*width, y: 2.29129*height), control2: CGPoint(x: 2.45472*width, y: 2.28729*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 2.56398*width, y: 2.25225*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.5689*width, y: 2.24324*height), control1: CGPoint(x: 2.57677*width, y: 2.24725*height), control2: CGPoint(x: 2.57776*width, y: 2.24324*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.53445*width, y: 2.25225*height), control1: CGPoint(x: 2.56102*width, y: 2.24324*height), control2: CGPoint(x: 2.54528*width, y: 2.24725*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.52953*width, y: 2.26126*height), control1: CGPoint(x: 2.52165*width, y: 2.25726*height), control2: CGPoint(x: 2.52067*width, y: 2.26126*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.56398*width, y: 2.25225*height), control1: CGPoint(x: 2.5374*width, y: 2.26126*height), control2: CGPoint(x: 2.55315*width, y: 2.25726*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 2.64173*width, y: 2.23023*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.69193*width, y: 2.20521*height), control1: CGPoint(x: 2.66339*width, y: 2.22322*height), control2: CGPoint(x: 2.68701*width, y: 2.21221*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.8937*width, y: 2.12913*height), control1: CGPoint(x: 2.69783*width, y: 2.1982*height), control2: CGPoint(x: 2.78839*width, y: 2.16416*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.66142*width, y: 1.68368*height), control1: CGPoint(x: 3.21555*width, y: 2.02202*height), control2: CGPoint(x: 3.37402*width, y: 1.92993*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.48917*width, y: 1.67568*height), control1: CGPoint(x: 3.67323*width, y: 1.67267*height), control2: CGPoint(x: 3.64272*width, y: 1.67167*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.08563*width, y: 1.76176*height), control1: CGPoint(x: 3.27264*width, y: 1.68068*height), control2: CGPoint(x: 3.23228*width, y: 1.68869*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.72736*width, y: 2.11712*height), control1: CGPoint(x: 2.92028*width, y: 1.84284*height), control2: CGPoint(x: 2.82677*width, y: 1.93594*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.63091*width, y: 2.22422*height), control1: CGPoint(x: 2.6811*width, y: 2.2012*height), control2: CGPoint(x: 2.6752*width, y: 2.20821*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 2.64173*width, y: 2.23023*height), control1: CGPoint(x: 2.57579*width, y: 2.24324*height), control2: CGPoint(x: 2.58268*width, y: 2.24725*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 3.85531*width, y: 1.70571*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.83661*width, y: 1.7047*height), control1: CGPoint(x: 3.85236*width, y: 1.7027*height), control2: CGPoint(x: 3.8435*width, y: 1.7017*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.84252*width, y: 1.71071*height), control1: CGPoint(x: 3.82874*width, y: 1.70771*height), control2: CGPoint(x: 3.83169*width, y: 1.71071*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.85531*width, y: 1.70571*height), control1: CGPoint(x: 3.85335*width, y: 1.71171*height), control2: CGPoint(x: 3.85925*width, y: 1.70871*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 3.8061*width, y: 1.6957*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.7874*width, y: 1.69469*height), control1: CGPoint(x: 3.80315*width, y: 1.69269*height), control2: CGPoint(x: 3.79429*width, y: 1.69169*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.79331*width, y: 1.7007*height), control1: CGPoint(x: 3.77953*width, y: 1.6977*height), control2: CGPoint(x: 3.78248*width, y: 1.7007*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.8061*width, y: 1.6957*height), control1: CGPoint(x: 3.80413*width, y: 1.7017*height), control2: CGPoint(x: 3.81004*width, y: 1.6987*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        path.move(to: CGPoint(x: 3.74311*width, y: 1.68468*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.7185*width, y: 1.68468*height), control1: CGPoint(x: 3.73622*width, y: 1.68268*height), control2: CGPoint(x: 3.72441*width, y: 1.68268*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.73031*width, y: 1.68969*height), control1: CGPoint(x: 3.71161*width, y: 1.68769*height), control2: CGPoint(x: 3.71654*width, y: 1.68969*height))
 | 
				
			||||||
 | 
					        path.addCurve(to: CGPoint(x: 3.74311*width, y: 1.68468*height), control1: CGPoint(x: 3.74409*width, y: 1.68969*height), control2: CGPoint(x: 3.74902*width, y: 1.68769*height))
 | 
				
			||||||
 | 
					        path.closeSubpath()
 | 
				
			||||||
 | 
					        return path
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					import GRDB
 | 
				
			||||||
 | 
					/// The Seg struct.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Identifiable conformance supports SwiftUI list animations, and type-safe
 | 
				
			||||||
 | 
					/// GRDB primary key methods.
 | 
				
			||||||
 | 
					/// Equatable conformance supports tests.
 | 
				
			||||||
 | 
					struct Seg: Identifiable, Equatable {
 | 
				
			||||||
 | 
					    /// Int64 is the recommended type for auto-incremented database ids.
 | 
				
			||||||
 | 
					    /// Use nil for players that are not inserted yet in the database.
 | 
				
			||||||
 | 
					    var id: Int64?
 | 
				
			||||||
 | 
					    var seg_id: Int64
 | 
				
			||||||
 | 
					    var line_id: Int64
 | 
				
			||||||
 | 
					    var book: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extension Seg {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MARK: - Persistence
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Make Seg a Codable Record.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
 | 
				
			||||||
 | 
					extension Seg: Codable, FetchableRecord, MutablePersistableRecord {
 | 
				
			||||||
 | 
					    // Define database columns from CodingKeys
 | 
				
			||||||
 | 
					    fileprivate enum Columns {
 | 
				
			||||||
 | 
					        static let id = Column(CodingKeys.id)
 | 
				
			||||||
 | 
					        static let book = Column(CodingKeys.book)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /// Updates a player id after it has been inserted in the database.
 | 
				
			||||||
 | 
					    mutating func didInsert(_ inserted: InsertionSuccess) {
 | 
				
			||||||
 | 
					        id = inserted.rowID
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MARK: - Seg Database Requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Define some player requests used by the application.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
 | 
				
			||||||
 | 
					/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
 | 
				
			||||||
 | 
					extension DerivableRequest<Seg> {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					import GRDB
 | 
				
			||||||
 | 
					/// The SegDenorm struct.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Identifiable conformance supports SwiftUI list animations, and type-safe
 | 
				
			||||||
 | 
					/// GRDB primary key methods.
 | 
				
			||||||
 | 
					/// Equatable conformance supports tests.
 | 
				
			||||||
 | 
					struct SegDenorm: Identifiable, Equatable {
 | 
				
			||||||
 | 
					    /// Int64 is the recommended type for auto-incremented database ids.
 | 
				
			||||||
 | 
					    /// Use nil for players that are not inserted yet in the database.
 | 
				
			||||||
 | 
					    var id: Int64
 | 
				
			||||||
 | 
					    var body: String
 | 
				
			||||||
 | 
					    // var lineIds: [Int64]
 | 
				
			||||||
 | 
					    var book: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extension SegDenorm {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MARK: - Persistence
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Make SegDenorm a Codable Record.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
 | 
				
			||||||
 | 
					extension SegDenorm: Codable, FetchableRecord, MutablePersistableRecord {
 | 
				
			||||||
 | 
					//     // Define database columns from CodingKeys
 | 
				
			||||||
 | 
					//     fileprivate enum Columns {
 | 
				
			||||||
 | 
					//         static let id = Column(CodingKeys.id)
 | 
				
			||||||
 | 
					//         static let book = Column(CodingKeys.book)
 | 
				
			||||||
 | 
					//     }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					//     /// Updates a player id after it has been inserted in the database.
 | 
				
			||||||
 | 
					//     mutating func didInsert(_ inserted: InsertionSuccess) {
 | 
				
			||||||
 | 
					//         id = inserted.rowID
 | 
				
			||||||
 | 
					//     }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MARK: - SegDenorm Database Requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Define some player requests used by the application.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
 | 
				
			||||||
 | 
					/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
 | 
				
			||||||
 | 
					extension DerivableRequest<SegDenorm> {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					import Combine
 | 
				
			||||||
 | 
					import GRDB
 | 
				
			||||||
 | 
					import GRDBQuery
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SegDenormRequest: Queryable {
 | 
				
			||||||
 | 
					    enum Ordering {
 | 
				
			||||||
 | 
					        case byScore
 | 
				
			||||||
 | 
					        case byName
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var book: String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // MARK: - Queryable Implementation
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    static var defaultValue: [SegDenorm] { [] }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func publisher(in appDatabase: AppDatabase) -> AnyPublisher<[SegDenorm], Error> {
 | 
				
			||||||
 | 
					        ValueObservation
 | 
				
			||||||
 | 
					            .tracking(fetchValue(_:))
 | 
				
			||||||
 | 
					            .publisher(
 | 
				
			||||||
 | 
					                in: appDatabase.reader,
 | 
				
			||||||
 | 
					                scheduling: .immediate)
 | 
				
			||||||
 | 
					            .eraseToAnyPublisher()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func fetchValue(_ db: Database) throws -> [SegDenorm] {
 | 
				
			||||||
 | 
					        print("WOOOOOOF")
 | 
				
			||||||
 | 
					        var sql = "select seg_id as id, seg.book as book, group_concat(line.body, ';;') as body from seg join line on seg.line_id = line.rowid WHERE seg.book = 'bible.john' group by seg.seg_id"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        do {
 | 
				
			||||||
 | 
					            var ret =  try SegDenorm.fetchAll(db, sql: sql) // [Player]
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        print("SEGS DENORM")
 | 
				
			||||||
 | 
					        print(ret)
 | 
				
			||||||
 | 
					        return ret
 | 
				
			||||||
 | 
					    } catch let error {
 | 
				
			||||||
 | 
					        print(error.localizedDescription)
 | 
				
			||||||
 | 
					        print(error)
 | 
				
			||||||
 | 
					        print("Error")
 | 
				
			||||||
 | 
					        return []
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					        // if book == "" {
 | 
				
			||||||
 | 
					        //     return try Seg.filter(bookColumn ==  "bible.john")).fetchAll(db)
 | 
				
			||||||
 | 
					        // } else {
 | 
				
			||||||
 | 
					        //     return try Seg.filter(bookColumn ==  book).fetchAll(db)
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					        // switch ordering {
 | 
				
			||||||
 | 
					        // case .byScore:
 | 
				
			||||||
 | 
					        //     return try Seg.all().fetchAll(db)
 | 
				
			||||||
 | 
					        // case .byName:
 | 
				
			||||||
 | 
					        //     // return try Seg.all().orderedByName().fetchAll(db)
 | 
				
			||||||
 | 
					        //     return try Seg.all().fetchAll(db)
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -43,12 +43,19 @@ struct SelectedRibbonRequest: Queryable {
 | 
				
			||||||
    // This method is not required by Queryable, but it makes it easier
 | 
					    // This method is not required by Queryable, but it makes it easier
 | 
				
			||||||
    func fetchValue(_ db: Database) throws -> [Ribbon] {
 | 
					    func fetchValue(_ db: Database) throws -> [Ribbon] {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        print("FETCH SELECTED RIBBON")
 | 
					        // print("FETCH SELECTED RIBBON")
 | 
				
			||||||
        var ret2 =  try SelectedRibbon.fetchAll(db, sql: "SELECT * FROM selectedRibbon") // [Player]
 | 
					        // var ret2 =  try SelectedRibbon.fetchAll(db, sql: "SELECT * FROM selectedRibbon") // [Player]
 | 
				
			||||||
        print(ret2)
 | 
					        // print(ret2)
 | 
				
			||||||
        print("FETCH JOIN RIBBON")
 | 
					
 | 
				
			||||||
        var ret =  try Ribbon.fetchAll(db, sql: "SELECT ribbon.* FROM selectedRibbon join ribbon on selectedRibbon.ribbonId = ribbon.rowid WHERE selectedRibbon.rowid = 1") // [Player]
 | 
					        // print("FETCH RIBBON")
 | 
				
			||||||
        print(ret)
 | 
					        // var ret3 =  try Ribbon.fetchAll(db, sql: "SELECT * FROM Ribbon") // [Player]
 | 
				
			||||||
 | 
					        // print(ret3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // print("FETCH JOIN RIBBON")
 | 
				
			||||||
 | 
					        var ret =  try Ribbon.fetchAll(db, sql: "SELECT Ribbon.* FROM SelectedRibbon join Ribbon on SelectedRibbon.ribbonId = ribbon.rowId WHERE SelectedRibbon.rowId = 1") // [Player]
 | 
				
			||||||
 | 
					        // print(ret)
 | 
				
			||||||
        return ret
 | 
					        return ret
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,79 @@
 | 
				
			||||||
 | 
					// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 | 
				
			||||||
 | 
					//  Created by Sam Deane on 27/07/22.
 | 
				
			||||||
 | 
					//  All code (c) 2022 - present day, Elegant Chaos Limited.
 | 
				
			||||||
 | 
					// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import SwiftUI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public enum VisibilityChange {
 | 
				
			||||||
 | 
					    case hidden
 | 
				
			||||||
 | 
					    case shown
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class VisibilityTracker<ID: Hashable>: ObservableObject {
 | 
				
			||||||
 | 
					    /// The global bounds of the container view.
 | 
				
			||||||
 | 
					    public var containerBounds: CGRect
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /// Dictionary containing the offset of every visible view.
 | 
				
			||||||
 | 
					    public var visibleViews: [ID:CGFloat]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /// Ids of the visible views, sorted by offset.
 | 
				
			||||||
 | 
					    /// The first item is the top view, the last one, the bottom view.
 | 
				
			||||||
 | 
					    public var sortedViewIDs: [ID]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /// Action to perform when a view becomes visible or is hidden.
 | 
				
			||||||
 | 
					    public var action: Action
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /// The id of the top visible view.
 | 
				
			||||||
 | 
					    public var topVisibleView: ID? { sortedViewIDs.first }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /// The id of the bottom visible view.
 | 
				
			||||||
 | 
					    public var bottomVisibleView: ID? { sortedViewIDs.last }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Action callback signature.
 | 
				
			||||||
 | 
					    public typealias Action = (ID, VisibilityChange, VisibilityTracker<ID>) -> ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public init(action: @escaping Action) {
 | 
				
			||||||
 | 
					        self.containerBounds = .zero
 | 
				
			||||||
 | 
					        self.visibleViews = [:]
 | 
				
			||||||
 | 
					        self.sortedViewIDs = []
 | 
				
			||||||
 | 
					        self.action = action
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public func reportContainerBounds(_ bounds: CGRect) {
 | 
				
			||||||
 | 
					        containerBounds = bounds
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public func reportContentBounds(_ bounds: CGRect, id: ID) {
 | 
				
			||||||
 | 
					        let topLeft = bounds.origin
 | 
				
			||||||
 | 
					        let size = bounds.size
 | 
				
			||||||
 | 
					        let bottomRight = CGPoint(x: topLeft.x + size.width, y: topLeft.y + size.height)
 | 
				
			||||||
 | 
					        let isVisible = containerBounds.contains(topLeft) || containerBounds.contains(bottomRight)
 | 
				
			||||||
 | 
					        let wasVisible = visibleViews[id] != nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        visibleViews[id] = -1 * (bounds.origin.y - containerBounds.origin.y)
 | 
				
			||||||
 | 
					        sortViews()
 | 
				
			||||||
 | 
					        action(id, .shown, self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // if isVisible {
 | 
				
			||||||
 | 
					        //     visibleViews[id] = bounds.origin.y - containerBounds.origin.y
 | 
				
			||||||
 | 
					        //     sortViews()
 | 
				
			||||||
 | 
					        //     if !wasVisible {
 | 
				
			||||||
 | 
					        //         action(id, .shown, self)
 | 
				
			||||||
 | 
					        //     }
 | 
				
			||||||
 | 
					        // } else {
 | 
				
			||||||
 | 
					        //     if wasVisible {
 | 
				
			||||||
 | 
					        //         visibleViews.removeValue(forKey: id)
 | 
				
			||||||
 | 
					        //         sortViews()
 | 
				
			||||||
 | 
					        //         action(id, .hidden, self)
 | 
				
			||||||
 | 
					        //     }
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func sortViews() {
 | 
				
			||||||
 | 
					        let sortedPairs = visibleViews.sorted(by: { $0.1 < $1.1 })
 | 
				
			||||||
 | 
					        sortedViewIDs = sortedPairs.map { $0.0 }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,34 @@
 | 
				
			||||||
 | 
					// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 | 
				
			||||||
 | 
					//  Created by Sam Deane on 27/07/22.
 | 
				
			||||||
 | 
					//  All code (c) 2022 - present day, Elegant Chaos Limited.
 | 
				
			||||||
 | 
					// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import SwiftUI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ContentVisibilityTrackingModifier<ID: Hashable>: ViewModifier {
 | 
				
			||||||
 | 
					    @EnvironmentObject var visibilityTracker: VisibilityTracker<ID>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    let id: ID
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func body(content: Content) -> some View {
 | 
				
			||||||
 | 
					        content
 | 
				
			||||||
 | 
					            .id(id)
 | 
				
			||||||
 | 
					            .background(
 | 
				
			||||||
 | 
					                GeometryReader { proxy in
 | 
				
			||||||
 | 
					                    report(proxy: proxy)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func report(proxy: GeometryProxy) -> Color {
 | 
				
			||||||
 | 
					        visibilityTracker.reportContentBounds(proxy.frame(in: .global), id: id)
 | 
				
			||||||
 | 
					        return Color.clear
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public extension View {
 | 
				
			||||||
 | 
					    func trackVisibility<ID: Hashable>(id: ID) -> some View {
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					            .modifier(ContentVisibilityTrackingModifier(id: id))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 | 
				
			||||||
 | 
					//  Created by Sam Deane on 27/07/22.
 | 
				
			||||||
 | 
					//  All code (c) 2022 - present day, Elegant Chaos Limited.
 | 
				
			||||||
 | 
					// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import SwiftUI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public struct VisibilityTrackingScrollView<Content, ID>: View where Content: View, ID: Hashable {
 | 
				
			||||||
 | 
					    @ViewBuilder let content: Content
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @State var visibilityTracker: VisibilityTracker<ID>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public init(action: @escaping VisibilityTracker<ID>.Action, @ViewBuilder content: () -> Content) {
 | 
				
			||||||
 | 
					        self.content = content()
 | 
				
			||||||
 | 
					        self._visibilityTracker = .init(initialValue: VisibilityTracker<ID>(action: action))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public var body: some View {
 | 
				
			||||||
 | 
					        ScrollView {
 | 
				
			||||||
 | 
					            content
 | 
				
			||||||
 | 
					                .environmentObject(visibilityTracker)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        .background(
 | 
				
			||||||
 | 
					            GeometryReader { proxy in
 | 
				
			||||||
 | 
					                report(proxy: proxy)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func report(proxy: GeometryProxy) -> Color {
 | 
				
			||||||
 | 
					        visibilityTracker.reportContainerBounds(proxy.frame(in: .global))
 | 
				
			||||||
 | 
					        return Color.clear
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,10 @@
 | 
				
			||||||
		8514D5BF299F04710054F185 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5BE299F04710054F185 /* GRDB */; };
 | 
							8514D5BF299F04710054F185 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5BE299F04710054F185 /* GRDB */; };
 | 
				
			||||||
		8514D5C2299F04A20054F185 /* GRDBQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5C1299F04A20054F185 /* GRDBQuery */; };
 | 
							8514D5C2299F04A20054F185 /* GRDBQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5C1299F04A20054F185 /* GRDBQuery */; };
 | 
				
			||||||
		852774C129A150B100458CA7 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852774C029A150B100458CA7 /* Line.swift */; };
 | 
							852774C129A150B100458CA7 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852774C029A150B100458CA7 /* Line.swift */; };
 | 
				
			||||||
 | 
							8528897529B2B86B003F2E16 /* CrownOfThorns.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897429B2B86B003F2E16 /* CrownOfThorns.swift */; };
 | 
				
			||||||
 | 
							8528897C29BD69B2003F2E16 /* VisibilityTrackingScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897929BD69B1003F2E16 /* VisibilityTrackingScrollView.swift */; };
 | 
				
			||||||
 | 
							8528897D29BD69B2003F2E16 /* VisibilityTrackingModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897A29BD69B1003F2E16 /* VisibilityTrackingModifier.swift */; };
 | 
				
			||||||
 | 
							8528897E29BD69B2003F2E16 /* VisibilityTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897B29BD69B2003F2E16 /* VisibilityTracker.swift */; };
 | 
				
			||||||
		85431A892905F4F500EE0760 /* glossApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A882905F4F500EE0760 /* glossApp.swift */; };
 | 
							85431A892905F4F500EE0760 /* glossApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A882905F4F500EE0760 /* glossApp.swift */; };
 | 
				
			||||||
		85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A8A2905F4F500EE0760 /* ContentView.swift */; };
 | 
							85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A8A2905F4F500EE0760 /* ContentView.swift */; };
 | 
				
			||||||
		85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85431A8C2905F4F600EE0760 /* Assets.xcassets */; };
 | 
							85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85431A8C2905F4F600EE0760 /* Assets.xcassets */; };
 | 
				
			||||||
| 
						 | 
					@ -21,14 +25,17 @@
 | 
				
			||||||
		8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96629A183EE001EF84F /* AppDatabase.swift */; };
 | 
							8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96629A183EE001EF84F /* AppDatabase.swift */; };
 | 
				
			||||||
		8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96829A18A6C001EF84F /* LineRequest.swift */; };
 | 
							8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96829A18A6C001EF84F /* LineRequest.swift */; };
 | 
				
			||||||
		8590D96C29A92146001EF84F /* JsonImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96B29A92146001EF84F /* JsonImport.swift */; };
 | 
							8590D96C29A92146001EF84F /* JsonImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96B29A92146001EF84F /* JsonImport.swift */; };
 | 
				
			||||||
		8590D96E29A927CF001EF84F /* Seg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96D29A927CF001EF84F /* Seg.swift */; };
 | 
					 | 
				
			||||||
		8590D97229A9366C001EF84F /* john_export.json in Resources */ = {isa = PBXBuildFile; fileRef = 8590D97129A9366C001EF84F /* john_export.json */; };
 | 
					 | 
				
			||||||
		85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE329ACF54A00307621 /* ScrollableView.swift */; };
 | 
							85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE329ACF54A00307621 /* ScrollableView.swift */; };
 | 
				
			||||||
		85942EE729AD083600307621 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 85942EE629AD083600307621 /* Introspect */; };
 | 
							85942EE729AD083600307621 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 85942EE629AD083600307621 /* Introspect */; };
 | 
				
			||||||
		85942EE929AD51A100307621 /* Ribbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE829AD51A100307621 /* Ribbon.swift */; };
 | 
							85942EE929AD51A100307621 /* Ribbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE829AD51A100307621 /* Ribbon.swift */; };
 | 
				
			||||||
		85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEA29AD55A400307621 /* RibbonRequest.swift */; };
 | 
							85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEA29AD55A400307621 /* RibbonRequest.swift */; };
 | 
				
			||||||
		85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEC29AEA04200307621 /* SelectedRibbon.swift */; };
 | 
							85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEC29AEA04200307621 /* SelectedRibbon.swift */; };
 | 
				
			||||||
		85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */; };
 | 
							85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */; };
 | 
				
			||||||
 | 
							85942EF529B108C600307621 /* Seg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EF429B108C600307621 /* Seg.swift */; };
 | 
				
			||||||
 | 
							85942EF729B108EA00307621 /* SegDenormRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EF629B108EA00307621 /* SegDenormRequest.swift */; };
 | 
				
			||||||
 | 
							85942EF929B1150B00307621 /* SegDenorm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EF829B1150B00307621 /* SegDenorm.swift */; };
 | 
				
			||||||
 | 
							85942EFE29B11C0B00307621 /* john_export.json in Resources */ = {isa = PBXBuildFile; fileRef = 85942EFC29B11C0A00307621 /* john_export.json */; };
 | 
				
			||||||
 | 
							85942EFF29B11C0B00307621 /* mark_export.json in Resources */ = {isa = PBXBuildFile; fileRef = 85942EFD29B11C0B00307621 /* mark_export.json */; };
 | 
				
			||||||
		85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */; };
 | 
							85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */; };
 | 
				
			||||||
		85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */; };
 | 
							85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */; };
 | 
				
			||||||
/* End PBXBuildFile section */
 | 
					/* End PBXBuildFile section */
 | 
				
			||||||
| 
						 | 
					@ -36,6 +43,10 @@
 | 
				
			||||||
/* Begin PBXFileReference section */
 | 
					/* Begin PBXFileReference section */
 | 
				
			||||||
		8514D5BB299EFB780054F185 /* store.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = store.db; sourceTree = "<group>"; };
 | 
							8514D5BB299EFB780054F185 /* store.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = store.db; sourceTree = "<group>"; };
 | 
				
			||||||
		852774C029A150B100458CA7 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
 | 
							852774C029A150B100458CA7 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							8528897429B2B86B003F2E16 /* CrownOfThorns.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrownOfThorns.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							8528897929BD69B1003F2E16 /* VisibilityTrackingScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibilityTrackingScrollView.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							8528897A29BD69B1003F2E16 /* VisibilityTrackingModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibilityTrackingModifier.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							8528897B29BD69B2003F2E16 /* VisibilityTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibilityTracker.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		85431A852905F4F500EE0760 /* gloss.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = gloss.app; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
							85431A852905F4F500EE0760 /* gloss.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = gloss.app; sourceTree = BUILT_PRODUCTS_DIR; };
 | 
				
			||||||
		85431A882905F4F500EE0760 /* glossApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = glossApp.swift; sourceTree = "<group>"; };
 | 
							85431A882905F4F500EE0760 /* glossApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = glossApp.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		85431A8A2905F4F500EE0760 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
 | 
							85431A8A2905F4F500EE0760 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -47,13 +58,16 @@
 | 
				
			||||||
		8590D96629A183EE001EF84F /* AppDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDatabase.swift; sourceTree = "<group>"; };
 | 
							8590D96629A183EE001EF84F /* AppDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDatabase.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		8590D96829A18A6C001EF84F /* LineRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineRequest.swift; sourceTree = "<group>"; };
 | 
							8590D96829A18A6C001EF84F /* LineRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineRequest.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		8590D96B29A92146001EF84F /* JsonImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonImport.swift; sourceTree = "<group>"; };
 | 
							8590D96B29A92146001EF84F /* JsonImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonImport.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		8590D96D29A927CF001EF84F /* Seg.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seg.swift; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		8590D97129A9366C001EF84F /* john_export.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = john_export.json; sourceTree = "<group>"; };
 | 
					 | 
				
			||||||
		85942EE329ACF54A00307621 /* ScrollableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollableView.swift; sourceTree = "<group>"; };
 | 
							85942EE329ACF54A00307621 /* ScrollableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollableView.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		85942EE829AD51A100307621 /* Ribbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ribbon.swift; sourceTree = "<group>"; };
 | 
							85942EE829AD51A100307621 /* Ribbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ribbon.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		85942EEA29AD55A400307621 /* RibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RibbonRequest.swift; sourceTree = "<group>"; };
 | 
							85942EEA29AD55A400307621 /* RibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RibbonRequest.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		85942EEC29AEA04200307621 /* SelectedRibbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbon.swift; sourceTree = "<group>"; };
 | 
							85942EEC29AEA04200307621 /* SelectedRibbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbon.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbonRequest.swift; sourceTree = "<group>"; };
 | 
							85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbonRequest.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							85942EF429B108C600307621 /* Seg.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seg.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							85942EF629B108EA00307621 /* SegDenormRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegDenormRequest.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							85942EF829B1150B00307621 /* SegDenorm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegDenorm.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							85942EFC29B11C0A00307621 /* john_export.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = john_export.json; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							85942EFD29B11C0B00307621 /* mark_export.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = mark_export.json; sourceTree = "<group>"; };
 | 
				
			||||||
		85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AveriaSerifLibre-Regular.ttf"; sourceTree = "<group>"; };
 | 
							85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AveriaSerifLibre-Regular.ttf"; sourceTree = "<group>"; };
 | 
				
			||||||
		85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "xe-Dogma-Bold.ttf"; sourceTree = "<group>"; };
 | 
							85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "xe-Dogma-Bold.ttf"; sourceTree = "<group>"; };
 | 
				
			||||||
		85F01DFC29787B3500F317B4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 | 
							85F01DFC29787B3500F317B4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 | 
				
			||||||
| 
						 | 
					@ -87,10 +101,17 @@
 | 
				
			||||||
		85431A7C2905F4F500EE0760 = {
 | 
							85431A7C2905F4F500EE0760 = {
 | 
				
			||||||
			isa = PBXGroup;
 | 
								isa = PBXGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
 | 
									8528897429B2B86B003F2E16 /* CrownOfThorns.swift */,
 | 
				
			||||||
				85942EEC29AEA04200307621 /* SelectedRibbon.swift */,
 | 
									85942EEC29AEA04200307621 /* SelectedRibbon.swift */,
 | 
				
			||||||
				85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */,
 | 
									85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */,
 | 
				
			||||||
 | 
									85942EF429B108C600307621 /* Seg.swift */,
 | 
				
			||||||
 | 
									85942EF629B108EA00307621 /* SegDenormRequest.swift */,
 | 
				
			||||||
 | 
									85942EF829B1150B00307621 /* SegDenorm.swift */,
 | 
				
			||||||
				85942EEA29AD55A400307621 /* RibbonRequest.swift */,
 | 
									85942EEA29AD55A400307621 /* RibbonRequest.swift */,
 | 
				
			||||||
				85942EE329ACF54A00307621 /* ScrollableView.swift */,
 | 
									85942EE329ACF54A00307621 /* ScrollableView.swift */,
 | 
				
			||||||
 | 
									8528897B29BD69B2003F2E16 /* VisibilityTracker.swift */,
 | 
				
			||||||
 | 
									8528897A29BD69B1003F2E16 /* VisibilityTrackingModifier.swift */,
 | 
				
			||||||
 | 
									8528897929BD69B1003F2E16 /* VisibilityTrackingScrollView.swift */,
 | 
				
			||||||
				8590D96A29A8374B001EF84F /* json */,
 | 
									8590D96A29A8374B001EF84F /* json */,
 | 
				
			||||||
				8514D5BA299EF2EC0054F185 /* db */,
 | 
									8514D5BA299EF2EC0054F185 /* db */,
 | 
				
			||||||
				85F01DF9297878B400F317B4 /* fonts */,
 | 
									85F01DF9297878B400F317B4 /* fonts */,
 | 
				
			||||||
| 
						 | 
					@ -112,7 +133,6 @@
 | 
				
			||||||
			isa = PBXGroup;
 | 
								isa = PBXGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
				8590D96B29A92146001EF84F /* JsonImport.swift */,
 | 
									8590D96B29A92146001EF84F /* JsonImport.swift */,
 | 
				
			||||||
				8590D96D29A927CF001EF84F /* Seg.swift */,
 | 
					 | 
				
			||||||
				85F01DFD297A4EEA00F317B4 /* gloss.entitlements */,
 | 
									85F01DFD297A4EEA00F317B4 /* gloss.entitlements */,
 | 
				
			||||||
				85F01DFC29787B3500F317B4 /* Info.plist */,
 | 
									85F01DFC29787B3500F317B4 /* Info.plist */,
 | 
				
			||||||
				8590D96629A183EE001EF84F /* AppDatabase.swift */,
 | 
									8590D96629A183EE001EF84F /* AppDatabase.swift */,
 | 
				
			||||||
| 
						 | 
					@ -141,7 +161,8 @@
 | 
				
			||||||
		8590D96A29A8374B001EF84F /* json */ = {
 | 
							8590D96A29A8374B001EF84F /* json */ = {
 | 
				
			||||||
			isa = PBXGroup;
 | 
								isa = PBXGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
				8590D97129A9366C001EF84F /* john_export.json */,
 | 
									85942EFC29B11C0A00307621 /* john_export.json */,
 | 
				
			||||||
 | 
									85942EFD29B11C0B00307621 /* mark_export.json */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			path = json;
 | 
								path = json;
 | 
				
			||||||
			sourceTree = "<group>";
 | 
								sourceTree = "<group>";
 | 
				
			||||||
| 
						 | 
					@ -236,7 +257,8 @@
 | 
				
			||||||
				85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */,
 | 
									85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */,
 | 
				
			||||||
				85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */,
 | 
									85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */,
 | 
				
			||||||
				8514D5BC299EFB780054F185 /* store.db in Resources */,
 | 
									8514D5BC299EFB780054F185 /* store.db in Resources */,
 | 
				
			||||||
				8590D97229A9366C001EF84F /* john_export.json in Resources */,
 | 
									85942EFF29B11C0B00307621 /* mark_export.json in Resources */,
 | 
				
			||||||
 | 
									85942EFE29B11C0B00307621 /* john_export.json in Resources */,
 | 
				
			||||||
				85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */,
 | 
									85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
| 
						 | 
					@ -251,17 +273,23 @@
 | 
				
			||||||
				85431A922905F4F600EE0760 /* Persistence.swift in Sources */,
 | 
									85431A922905F4F600EE0760 /* Persistence.swift in Sources */,
 | 
				
			||||||
				85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */,
 | 
									85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */,
 | 
				
			||||||
				85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */,
 | 
									85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */,
 | 
				
			||||||
 | 
									85942EF529B108C600307621 /* Seg.swift in Sources */,
 | 
				
			||||||
 | 
									8528897529B2B86B003F2E16 /* CrownOfThorns.swift in Sources */,
 | 
				
			||||||
				85431A952905F4F600EE0760 /* gloss.xcdatamodeld in Sources */,
 | 
									85431A952905F4F600EE0760 /* gloss.xcdatamodeld in Sources */,
 | 
				
			||||||
				85942EE929AD51A100307621 /* Ribbon.swift in Sources */,
 | 
									85942EE929AD51A100307621 /* Ribbon.swift in Sources */,
 | 
				
			||||||
				8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */,
 | 
									8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */,
 | 
				
			||||||
				8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */,
 | 
									8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */,
 | 
				
			||||||
				8590D96E29A927CF001EF84F /* Seg.swift in Sources */,
 | 
					 | 
				
			||||||
				852774C129A150B100458CA7 /* Line.swift in Sources */,
 | 
									852774C129A150B100458CA7 /* Line.swift in Sources */,
 | 
				
			||||||
				85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */,
 | 
									85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */,
 | 
				
			||||||
				8590D96C29A92146001EF84F /* JsonImport.swift in Sources */,
 | 
									8590D96C29A92146001EF84F /* JsonImport.swift in Sources */,
 | 
				
			||||||
				85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */,
 | 
									85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */,
 | 
				
			||||||
				85431A892905F4F500EE0760 /* glossApp.swift in Sources */,
 | 
									85431A892905F4F500EE0760 /* glossApp.swift in Sources */,
 | 
				
			||||||
 | 
									8528897C29BD69B2003F2E16 /* VisibilityTrackingScrollView.swift in Sources */,
 | 
				
			||||||
 | 
									85942EF929B1150B00307621 /* SegDenorm.swift in Sources */,
 | 
				
			||||||
				85431A9C2905F5D800EE0760 /* SwiftUIView.swift in Sources */,
 | 
									85431A9C2905F5D800EE0760 /* SwiftUIView.swift in Sources */,
 | 
				
			||||||
 | 
									8528897E29BD69B2003F2E16 /* VisibilityTracker.swift in Sources */,
 | 
				
			||||||
 | 
									85942EF729B108EA00307621 /* SegDenormRequest.swift in Sources */,
 | 
				
			||||||
 | 
									8528897D29BD69B2003F2E16 /* VisibilityTrackingModifier.swift in Sources */,
 | 
				
			||||||
				85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */,
 | 
									85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -43,6 +43,13 @@ struct AppDatabase {
 | 
				
			||||||
                t.column("verse", .integer)
 | 
					                t.column("verse", .integer)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try db.create(table: "Seg") { t in
 | 
				
			||||||
 | 
					                t.autoIncrementedPrimaryKey("id")
 | 
				
			||||||
 | 
					                t.column("seg_id", .integer).notNull()
 | 
				
			||||||
 | 
					                t.column("line_id", .integer).notNull()
 | 
				
			||||||
 | 
					                t.column("book", .text).notNull()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            try db.create(table: "Ribbon") { t in
 | 
					            try db.create(table: "Ribbon") { t in
 | 
				
			||||||
                t.autoIncrementedPrimaryKey("id")
 | 
					                t.autoIncrementedPrimaryKey("id")
 | 
				
			||||||
                t.column("book", .text).notNull()
 | 
					                t.column("book", .text).notNull()
 | 
				
			||||||
| 
						 | 
					@ -53,6 +60,11 @@ struct AppDatabase {
 | 
				
			||||||
                t.autoIncrementedPrimaryKey("id")
 | 
					                t.autoIncrementedPrimaryKey("id")
 | 
				
			||||||
                t.column("ribbonId", .integer).notNull()
 | 
					                t.column("ribbonId", .integer).notNull()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try db.create(table: "foo2") { t in
 | 
				
			||||||
 | 
					                t.autoIncrementedPrimaryKey("id")
 | 
				
			||||||
 | 
					                t.column("ribbonId", .integer).notNull()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
| 
						 | 
					@ -117,17 +129,32 @@ extension AppDatabase {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let imports : JsonImport = load("john_export.json")
 | 
					        let imports : JsonImport = load("john_export.json")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try dbWriter.write { db in
 | 
					        try dbWriter.write { db in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//             try db.execute(sql: "DELETE FROM Line")
 | 
				
			||||||
 | 
					//             try db.execute(sql: "DELETE FROM Seg")
 | 
				
			||||||
 | 
					//             try db.execute(sql: "DELETE FROM Ribbon")
 | 
				
			||||||
 | 
					//             try db.execute(sql: "DELETE FROM SelectedRibbon")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if try Line.all().isEmpty(db) {
 | 
					            if try Line.all().isEmpty(db) {
 | 
				
			||||||
                for l in imports.lines {
 | 
					                for l in imports.lines {
 | 
				
			||||||
                    print("here")
 | 
					                    print("here")
 | 
				
			||||||
                    print(l.body)
 | 
					                    print(l.body)
 | 
				
			||||||
                    _ = try l.inserted(db)
 | 
					                    _ = try l.inserted(db)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for l in imports.segs {
 | 
				
			||||||
 | 
					                    print("here SEGS")
 | 
				
			||||||
 | 
					                    print(l.seg_id)
 | 
				
			||||||
 | 
					                    _ = try l.inserted(db)
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // print("cat")
 | 
					                // print("cat")
 | 
				
			||||||
                // try createRandomLines(db)
 | 
					                // try createRandomLines(db)
 | 
				
			||||||
                _ = try Ribbon(id: nil, book: "bible.john", scrollOffset: 0).inserted(db)
 | 
					
 | 
				
			||||||
                _ = try Ribbon(id: nil, book: "bible.john", scrollOffset: 2000).inserted(db)
 | 
					                _ = try Ribbon(id: 1, book: "bible.john", scrollOffset: 0).inserted(db)
 | 
				
			||||||
 | 
					                _ = try Ribbon(id: 2, book: "bible.john", scrollOffset: 2000).inserted(db)
 | 
				
			||||||
                _ = try SelectedRibbon(id: 1, ribbonId: 1).inserted(db)
 | 
					                _ = try SelectedRibbon(id: 1, ribbonId: 1).inserted(db)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -151,12 +178,6 @@ extension AppDatabase {
 | 
				
			||||||
//             }
 | 
					//             }
 | 
				
			||||||
//         }
 | 
					//         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//         /// Support for `createRandomLinesIfEmpty()` and `refreshLines()`.
 | 
					 | 
				
			||||||
        private func createRandomLines(_ db: Database) throws {
 | 
					 | 
				
			||||||
            for _ in 0..<500 {
 | 
					 | 
				
			||||||
                _ = try Line.makeRandom().inserted(db) // insert but ignore inserted id
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MARK: - Database Access: Reads
 | 
					// MARK: - Database Access: Reads
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@ import GRDB
 | 
				
			||||||
import GRDBQuery
 | 
					import GRDBQuery
 | 
				
			||||||
import Introspect
 | 
					import Introspect
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "network")
 | 
					let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "network")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// var curBook = "John"
 | 
					// var curBook = "John"
 | 
				
			||||||
| 
						 | 
					@ -48,12 +49,13 @@ struct SwitchButton : View {
 | 
				
			||||||
    var ribbon: Ribbon
 | 
					    var ribbon: Ribbon
 | 
				
			||||||
    // var selectedRibbon: SelectedRibbon
 | 
					    // var selectedRibbon: SelectedRibbon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Binding var book : String
 | 
					    // @Binding var book : String
 | 
				
			||||||
 | 
					    @Binding var scrollDelegate : ScrollViewHandler
 | 
				
			||||||
    @Binding var scrollView : UIScrollView?
 | 
					    @Binding var scrollView : UIScrollView?
 | 
				
			||||||
 | 
					    @Binding var scrollUpdate : Bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Environment(\.appDatabase) private var appDatabase
 | 
					    @Environment(\.appDatabase) private var appDatabase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Query(SelectedRibbonRequest()) private var sr: [Ribbon]
 | 
					    @Query(SelectedRibbonRequest()) private var sr: [Ribbon]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @State var saveOffset = CGFloat()
 | 
					    @State var saveOffset = CGFloat()
 | 
				
			||||||
| 
						 | 
					@ -66,21 +68,22 @@ struct SwitchButton : View {
 | 
				
			||||||
                       var selectedRibbon = sr[0]
 | 
					                       var selectedRibbon = sr[0]
 | 
				
			||||||
                       Print("SELECTED RIBBON", selectedRibbon) 
 | 
					                       Print("SELECTED RIBBON", selectedRibbon) 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                       var saveScrollOffset = scrollView!.contentOffset.y
 | 
					                       var saveScrollOffset = scrollDelegate.scrollOffset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                       var editedRibbon = selectedRibbon
 | 
					                       var editedRibbon = selectedRibbon
 | 
				
			||||||
                       editedRibbon.scrollOffset = Int(saveScrollOffset)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                       _ = try await appDatabase.saveRibbon(&editedRibbon)
 | 
					 | 
				
			||||||
                       _ = Print("editedRibbon", editedRibbon)
 | 
					 | 
				
			||||||
                       _ = Print("ribbon", ribbon)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                       Print("ribbon offset saved")
 | 
					                       Print("ribbon offset saved")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                       scrollUpdate = true
 | 
				
			||||||
                       if (selectedRibbon.id != ribbon.id!) {
 | 
					                       if (selectedRibbon.id != ribbon.id!) {
 | 
				
			||||||
                           Print("switching")
 | 
					                           Print("switching")
 | 
				
			||||||
                           book = ribbon.book
 | 
					                           // book = ribbon.book
 | 
				
			||||||
                           scrollView!.contentOffset.y = CGFloat(ribbon.scrollOffset)
 | 
					                           Print("applying offset", CGFloat(ribbon.scrollOffset))
 | 
				
			||||||
 | 
					                           // scrollOffset = CGFloat(ribbon.scrollOffset)
 | 
				
			||||||
 | 
					                           // scrollDelegate.scrollOffset = CGFloat(ribbon.scrollOffset)
 | 
				
			||||||
 | 
					                           scrollDelegate.scrollOffset = CGFloat(ribbon.scrollOffset)
 | 
				
			||||||
 | 
					                           // scrollView!.contentOffset.y = CGFloat(ribbon.scrollOffset)
 | 
				
			||||||
                           // scrollOffset = CGFloat(1500)
 | 
					                           // scrollOffset = CGFloat(1500)
 | 
				
			||||||
                           var updateSelectRibbon = SelectedRibbon(id: Int64(1), ribbonId: ribbon.id!)
 | 
					                           var updateSelectRibbon = SelectedRibbon(id: Int64(1), ribbonId: ribbon.id!)
 | 
				
			||||||
                           Print("Savingg")
 | 
					                           Print("Savingg")
 | 
				
			||||||
| 
						 | 
					@ -92,6 +95,13 @@ struct SwitchButton : View {
 | 
				
			||||||
                           }
 | 
					                           }
 | 
				
			||||||
                       }
 | 
					                       }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                       editedRibbon.scrollOffset = Int(saveScrollOffset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                       _ = try await appDatabase.saveRibbon(&editedRibbon)
 | 
				
			||||||
 | 
					                       _ = Print("editedRibbon", editedRibbon)
 | 
				
			||||||
 | 
					                       _ = Print("ribbon", ribbon)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                   }
 | 
					                   }
 | 
				
			||||||
               }
 | 
					               }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,17 +113,127 @@ struct SwitchButton : View {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ScrollViewHandler: NSObject {
 | 
					class ScrollViewHandler: NSObject {
 | 
				
			||||||
 | 
					    public var scrollOffset =  CGFloat(10)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extension ScrollViewHandler: UIScrollViewDelegate {
 | 
					extension ScrollViewHandler: UIScrollViewDelegate {
 | 
				
			||||||
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
 | 
					    func scrollViewDidScroll(_ scrollView: UIScrollView) {
 | 
				
			||||||
        print("delegate", scrollView.contentOffset.y)
 | 
					        scrollOffset = CGFloat(scrollView.contentOffset.y)
 | 
				
			||||||
 | 
					        // print("delegate", scrollView.contentOffset.y)
 | 
				
			||||||
 | 
					        // print("delegate prop", self.scrollOffset)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Verse: NSObject, Codable {
 | 
				
			||||||
 | 
					    var body: String
 | 
				
			||||||
 | 
					    var verse: Int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func makeVerseView(seg: SegDenorm) -> some View {
 | 
				
			||||||
 | 
					    var retView = Text("")
 | 
				
			||||||
 | 
					    var segSplit = seg.body.components(separatedBy: ";;")
 | 
				
			||||||
 | 
					    // Text(segSplit[0].body)
 | 
				
			||||||
 | 
					    // .id(seg.id)
 | 
				
			||||||
 | 
					    // VStack {
 | 
				
			||||||
 | 
					    // ForEach(segSplit.indices) { i in
 | 
				
			||||||
 | 
					    let decoder = JSONDecoder()
 | 
				
			||||||
 | 
					    segSplit.enumerated().forEach({ (index, item) in
 | 
				
			||||||
 | 
					        let verse = try! decoder.decode(Verse.self, from: item.data(using: .utf8)!)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        retView = retView + Text(String(verse.verse))
 | 
				
			||||||
 | 
					        // Text(seg.body)
 | 
				
			||||||
 | 
					        // .contentShape(Rectangle())
 | 
				
			||||||
 | 
					        .font(Font.custom("AveriaSerifLibre-Regular", size: 20))
 | 
				
			||||||
 | 
					        .baselineOffset(6.0)
 | 
				
			||||||
 | 
					        .foregroundColor(Color.white)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        retView = retView + Text(verse.body)
 | 
				
			||||||
 | 
					        // .frame(maxWidth: .infinity, alignment: .leading)
 | 
				
			||||||
 | 
					        // .contentShape(Rectangle())
 | 
				
			||||||
 | 
					        .foregroundColor(Color.white)
 | 
				
			||||||
 | 
					        .font(Font.custom("AveriaSerifLibre-Regular", size: 30))
 | 
				
			||||||
 | 
					        // .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
 | 
				
			||||||
 | 
					        // .listRowInsets(EdgeInsets())
 | 
				
			||||||
 | 
					        // .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
 | 
				
			||||||
 | 
					        // .listRowSeparator(.hidden)
 | 
				
			||||||
 | 
					        // .id(String(seg.id) + "body" + String(i))
 | 
				
			||||||
 | 
					        // .id(seg.id)
 | 
				
			||||||
 | 
					        //.onTapGesture {
 | 
				
			||||||
 | 
					        //    selectedLine = seg.id
 | 
				
			||||||
 | 
					        //    //Print(selectedLine)
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
 | 
				
			||||||
 | 
					        // .listRowInsets(EdgeInsets())
 | 
				
			||||||
 | 
					        // .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
 | 
				
			||||||
 | 
					        // .listRowSeparator(.hidden)
 | 
				
			||||||
 | 
					        // .id(String(seg.id) + "verse" + String(i))
 | 
				
			||||||
 | 
					        // .id(seg.id)
 | 
				
			||||||
 | 
					        //.onTapGesture {
 | 
				
			||||||
 | 
					        //    selectedLine = seg.id
 | 
				
			||||||
 | 
					        //    //Print(selectedLine)
 | 
				
			||||||
 | 
					        //}
 | 
				
			||||||
 | 
					                                  })
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					    return retView
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private struct SegRow: View {
 | 
				
			||||||
 | 
					    var seg: SegDenorm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var body: some View {
 | 
				
			||||||
 | 
					        // makeVerseView(seg: seg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var retView = Text("")
 | 
				
			||||||
 | 
					        var segSplit = seg.body.components(separatedBy: ";;")
 | 
				
			||||||
 | 
					        let decoder = JSONDecoder()
 | 
				
			||||||
 | 
					        // Text(segSplit[0].body)
 | 
				
			||||||
 | 
					        // .id(seg.id)
 | 
				
			||||||
 | 
					        // VStack {
 | 
				
			||||||
 | 
					            // ForEach(segSplit.indices) { i in
 | 
				
			||||||
 | 
					            segSplit.enumerated().forEach({ (index, item) in
 | 
				
			||||||
 | 
					                let verse = try! decoder.decode(Verse.self, from: item.data(using: .utf8)!)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                 retView = retView + Text(String(verse.verse))
 | 
				
			||||||
 | 
					                // Text(seg.body)
 | 
				
			||||||
 | 
					                // .contentShape(Rectangle())
 | 
				
			||||||
 | 
					                .font(Font.custom("AveriaSerifLibre-Regular", size: 20))
 | 
				
			||||||
 | 
					                .baselineOffset(6.0)
 | 
				
			||||||
 | 
					                .foregroundColor(Color.white)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                retView = retView + Text(verse.body)
 | 
				
			||||||
 | 
					                // .frame(maxWidth: .infinity, alignment: .leading)
 | 
				
			||||||
 | 
					                // .contentShape(Rectangle())
 | 
				
			||||||
 | 
					                .foregroundColor(Color.white)
 | 
				
			||||||
 | 
					                .font(Font.custom("AveriaSerifLibre-Regular", size: 30))
 | 
				
			||||||
 | 
					                // .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
 | 
				
			||||||
 | 
					                // .listRowInsets(EdgeInsets())
 | 
				
			||||||
 | 
					                // .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
 | 
				
			||||||
 | 
					                // .listRowSeparator(.hidden)
 | 
				
			||||||
 | 
					                // .id(String(seg.id) + "body" + String(i))
 | 
				
			||||||
 | 
					                // .id(seg.id)
 | 
				
			||||||
 | 
					                //.onTapGesture {
 | 
				
			||||||
 | 
					                //    selectedLine = seg.id
 | 
				
			||||||
 | 
					                //    //Print(selectedLine)
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
 | 
				
			||||||
 | 
					                // .listRowInsets(EdgeInsets())
 | 
				
			||||||
 | 
					                // .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
 | 
				
			||||||
 | 
					                // .listRowSeparator(.hidden)
 | 
				
			||||||
 | 
					                // .id(String(seg.id) + "verse" + String(i))
 | 
				
			||||||
 | 
					                // .id(seg.id)
 | 
				
			||||||
 | 
					                //.onTapGesture {
 | 
				
			||||||
 | 
					                //    selectedLine = seg.id
 | 
				
			||||||
 | 
					                //    //Print(selectedLine)
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					         // }
 | 
				
			||||||
 | 
					        return retView
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ContentView: View {
 | 
					struct ContentView: View {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,9 +246,13 @@ struct ContentView: View {
 | 
				
			||||||
    @State var scrollOffset = CGFloat()
 | 
					    @State var scrollOffset = CGFloat()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @State var thisScrollView : UIScrollView?
 | 
					    @State var thisScrollView : UIScrollView?
 | 
				
			||||||
 | 
					    @State var scrollUpdate = false
 | 
				
			||||||
    @State var initLoad = false
 | 
					    @State var initLoad = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var scrollDelegate = ScrollViewHandler()
 | 
					    @Query(SegDenormRequest(book: "bible.mark")) private var segs: [SegDenorm]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @State var scrollDelegate: ScrollViewHandler
 | 
				
			||||||
 | 
					    // @State var scrollDelegate = ScrollViewHandler()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // @State var selectedRibbon: Ribbon!,
 | 
					    // @State var selectedRibbon: Ribbon!,
 | 
				
			||||||
    // @State var selectedRibbon: Ribbon!
 | 
					    // @State var selectedRibbon: Ribbon!
 | 
				
			||||||
| 
						 | 
					@ -142,94 +266,135 @@ struct ContentView: View {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @State var readOffset = CGPoint()
 | 
					    @State var readOffset = CGPoint()
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
    @Query(LineRequest(ordering: .byScore, book: "bible.john")) private var lines: [Line]
 | 
					    @State var refresh: Bool = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Query(RibbonRequest()) private var ribbons: [Ribbon]
 | 
					    @Query(RibbonRequest()) private var ribbons: [Ribbon]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // @Query*RibbonRequest> private var selectedRibbon: [Ribbon]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // @Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1))) private var selectedRibbon: [Ribbon]
 | 
					    // @Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1))) private var selectedRibbon: [Ribbon]
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    init() {
 | 
					    init() {
 | 
				
			||||||
        UITableView.appearance().backgroundColor = UIColor(Color(red: 0.2, green: 0.2, blue: 0.2))
 | 
					        UITableView.appearance().backgroundColor = UIColor(Color(red: 0.2, green: 0.2, blue: 0.2))
 | 
				
			||||||
         // _selectedRibbon = Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1)))
 | 
					         // _selectedRibbon = Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1)))
 | 
				
			||||||
 | 
					        self._scrollDelegate = State(initialValue: ScrollViewHandler())
 | 
				
			||||||
 | 
					        Print("initalizing")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    var body: some View {
 | 
					    var body: some View {
 | 
				
			||||||
 | 
					        Print("rendering")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        GeometryReader { geometry in
 | 
					        GeometryReader { geometry in
 | 
				
			||||||
            ZStack{
 | 
					            ZStack{
 | 
				
			||||||
                VStack{
 | 
					                VStack{
 | 
				
			||||||
                    Text("cat" + String(selectedRibbon[0].id!))
 | 
					
 | 
				
			||||||
 | 
					                    VStack{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // // Star(corners: 6, smoothness: 0.85, initAngle:-CGFloat.pi / 4)
 | 
				
			||||||
 | 
					                        // .fill(.blue)
 | 
				
			||||||
 | 
					                        // .frame(width: 200, height: 200)
 | 
				
			||||||
 | 
					                        // .background(Color.gray.opacity(0.0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // Star(corners: 6, smoothness: 0.85, initAngle:-CGFloat.pi / 2)
 | 
				
			||||||
 | 
					                        // .fill(.blue)
 | 
				
			||||||
 | 
					                        // .frame(width: 200, height: 200)
 | 
				
			||||||
 | 
					                        // .background(Color.gray.opacity(0.0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //    MyCustomShape().frame(width: 10, height: 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Text("MRK")
 | 
				
			||||||
 | 
					                    .font(Font.custom("AveriaSerifLibre-Regular", size: 20))
 | 
				
			||||||
 | 
					                    .foregroundColor(Color.white)
 | 
				
			||||||
 | 
					                    .background(Color(red: 0.3, green: 0.3, blue: 0.3))
 | 
				
			||||||
 | 
					                    .overlay( MyCustomShape().frame(width: 120, height: 100).foregroundColor(.white))
 | 
				
			||||||
 | 
					                    .frame(width: 120, height: 120)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Text("MTW")
 | 
				
			||||||
 | 
					                    .font(Font.custom("AveriaSerifLibre-Regular", size: 20))
 | 
				
			||||||
 | 
					                    .foregroundColor(Color.white)
 | 
				
			||||||
 | 
					                    .overlay( MyCustomShape().frame(width: 120, height: 100))
 | 
				
			||||||
 | 
					                    .frame(width: 120, height: 120)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Text("cat" + String(selectedRibbon[0].id!))
 | 
				
			||||||
                    ForEach(ribbons) { ribbon in
 | 
					                    ForEach(ribbons) { ribbon in
 | 
				
			||||||
                        //ForEach(selectedRibbon) { sr in
 | 
					                        //ForEach(selectedRibbon) { sr in
 | 
				
			||||||
                            SwitchButton(ribbon: ribbon,
 | 
					                            SwitchButton(ribbon: ribbon,
 | 
				
			||||||
                                         book: $lines.book,
 | 
					                                         scrollDelegate: $scrollDelegate,
 | 
				
			||||||
                                         scrollView:$thisScrollView
 | 
					                                         scrollView:$thisScrollView,
 | 
				
			||||||
 | 
					                                         scrollUpdate:$scrollUpdate
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            .buttonStyle(BlueButtonStyle())
 | 
					                            .buttonStyle(BlueButtonStyle())
 | 
				
			||||||
                        //}
 | 
					                        //}
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                .frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading)
 | 
					                .frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading)
 | 
				
			||||||
                .background(Color.red)
 | 
					                .background(Color(red: 0.1, green: 0.1, blue: 0.1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // VStack (spacing: 0){
 | 
					 | 
				
			||||||
                ScrollViewReader { proxy in
 | 
					                ScrollViewReader { proxy in
 | 
				
			||||||
                        //ScrollableView($offset, animationDuration: 0) {
 | 
					
 | 
				
			||||||
                        // OffsetObservingScrollView(offset: $readOffset)
 | 
					                   VisibilityTrackingScrollView(action: handleVisibilityChanged) {
 | 
				
			||||||
                        ScrollView
 | 
					                        // ScrollView {
 | 
				
			||||||
                        {
 | 
					
 | 
				
			||||||
                        // List {
 | 
					 | 
				
			||||||
                            LazyVStack {
 | 
					                            LazyVStack {
 | 
				
			||||||
                                ForEach(lines) { line in
 | 
					                                Text(refresh ? "Selected" : "not Selected")
 | 
				
			||||||
                                    Text(String(line.body))
 | 
					                                Button("Jump to #8") {
 | 
				
			||||||
                                        .frame(maxWidth: .infinity, alignment: .leading)
 | 
					
 | 
				
			||||||
                                        .contentShape(Rectangle())
 | 
					                                    proxy.scrollTo("5", anchor: .top)
 | 
				
			||||||
                                        .font(Font.custom("AveriaSerifLibre-Regular", size: 30))
 | 
					
 | 
				
			||||||
                                        .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
 | 
					                                  DispatchQueue.main.async { 
 | 
				
			||||||
                                        .foregroundColor(Color.white)
 | 
					                                      scrollOffset = 340
 | 
				
			||||||
                                        .listRowInsets(EdgeInsets())
 | 
					                                    refresh.toggle()
 | 
				
			||||||
                                        .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
 | 
					 | 
				
			||||||
                                        .listRowSeparator(.hidden)
 | 
					 | 
				
			||||||
                                        .id(line.id!)
 | 
					 | 
				
			||||||
                                        .onTapGesture {
 | 
					 | 
				
			||||||
                                            selectedLine = line.id!
 | 
					 | 
				
			||||||
                                            //Print(selectedLine)
 | 
					 | 
				
			||||||
                                  }
 | 
					                                  }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                ForEach(segs) { seg in
 | 
				
			||||||
 | 
					                                        SegRow(seg: seg)
 | 
				
			||||||
 | 
					                                        .id("\(seg.id)")
 | 
				
			||||||
 | 
					                                            
 | 
				
			||||||
 | 
					                                        .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
 | 
				
			||||||
 | 
					                                       .trackVisibility(id: "\(seg.id)")
 | 
				
			||||||
 | 
					                                    
 | 
				
			||||||
 | 
					                                    // .onChange(of: geometry.frame(in: .named("scrollView"))) { imageRect in
 | 
				
			||||||
 | 
					                                    //     Print(imageRect)
 | 
				
			||||||
 | 
					                                    //     Print(outerProxy)
 | 
				
			||||||
 | 
					                                        // if isInView(innerRect: imageRect, isIn: outerProxy) {
 | 
				
			||||||
 | 
					                                        //     visibleIndex.insert(item)
 | 
				
			||||||
 | 
					                                        // } else {
 | 
				
			||||||
 | 
					                                        //     visibleIndex.remove(item)
 | 
				
			||||||
 | 
					                                        // }
 | 
				
			||||||
                                    // }
 | 
					                                    // }
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            .background(Color(red: 0.2, green: 0.2, blue: 0.2))
 | 
					                            .background(Color(red: 0.2, green: 0.2, blue: 0.2))
 | 
				
			||||||
                            //.onChange(of: scrollTo1) { scrollTo in
 | 
					 | 
				
			||||||
                            //    // scrollTo1 = 0
 | 
					 | 
				
			||||||
                            //    let target = scrollTo
 | 
					 | 
				
			||||||
                            //    //Print("hellosdf")
 | 
					 | 
				
			||||||
                            //    //Print("value:",  target)
 | 
					 | 
				
			||||||
                            //    //Print("value2:",  scrollTo)
 | 
					 | 
				
			||||||
                            //    proxy.scrollTo(target, anchor: .top)
 | 
					 | 
				
			||||||
                            //}
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                         .introspectScrollView { scrollView in
 | 
					                         .introspectScrollView { scrollView in
 | 
				
			||||||
                            //let width = scrollView.contentSize.width - scrollView.frame.width
 | 
					
 | 
				
			||||||
                            //Print(scrollView.contentOffset.x)
 | 
					
 | 
				
			||||||
                            Print("introspect")
 | 
					                             // Print("introspect")
 | 
				
			||||||
                             scrollView.delegate = scrollDelegate
 | 
					                             scrollView.delegate = scrollDelegate
 | 
				
			||||||
 | 
					                             Print("Scroll delegate offset", scrollDelegate.scrollOffset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                             if (scrollOffset != 0) {
 | 
				
			||||||
 | 
					                                 Print("GOT THEHREHREH")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                 scrollView.contentOffset.y = scrollView.contentOffset.y + scrollOffset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                  DispatchQueue.main.async { scrollOffset = 0 }
 | 
				
			||||||
 | 
					                             }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                             if (thisScrollView == nil) {
 | 
					                             if (thisScrollView == nil) {
 | 
				
			||||||
 | 
					                                 Print("init scroll")
 | 
				
			||||||
                                 thisScrollView = scrollView
 | 
					                                 thisScrollView = scrollView
 | 
				
			||||||
                                 scrollView.contentOffset.y = CGFloat(selectedRibbon[0].scrollOffset)
 | 
					                                 scrollView.contentOffset.y = CGFloat(selectedRibbon[0].scrollOffset)
 | 
				
			||||||
                             }
 | 
					                             }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                            // scrollView.contentOffset.y = scrollOffset
 | 
					 | 
				
			||||||
                            // if (scrollOffset != scrollView.contentOffset.y) {
 | 
					 | 
				
			||||||
                            //     scrollView.contentOffset.y = scrollOffset
 | 
					 | 
				
			||||||
                            // }
 | 
					 | 
				
			||||||
                         }
 | 
					                         }
 | 
				
			||||||
                        .listStyle(PlainListStyle())
 | 
					                        .listStyle(PlainListStyle())
 | 
				
			||||||
                        
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                // }
 | 
					 | 
				
			||||||
                .background(Color(red: 0.2, green: 0.2, blue: 0.2))
 | 
					                .background(Color(red: 0.2, green: 0.2, blue: 0.2))
 | 
				
			||||||
                .frame(width: geometry.size.width - 50)
 | 
					                .frame(width: geometry.size.width - 50)
 | 
				
			||||||
                .offset(x:30 , y:0)
 | 
					                .offset(x:30 , y:0)
 | 
				
			||||||
| 
						 | 
					@ -247,7 +412,9 @@ struct ContentView: View {
 | 
				
			||||||
                        // logger.error("hello222")
 | 
					                        // logger.error("hello222")
 | 
				
			||||||
                        // NSLog("hellooo")
 | 
					                        // NSLog("hellooo")
 | 
				
			||||||
                        //Print(viewState.width)
 | 
					                        //Print(viewState.width)
 | 
				
			||||||
 | 
					                        if (abs(gesture.translation.width) > 20) {
 | 
				
			||||||
                            viewState.width = gesture.translation.width
 | 
					                            viewState.width = gesture.translation.width
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                        //offset.y = gesture.translation.width
 | 
					                        //offset.y = gesture.translation.width
 | 
				
			||||||
                        // logger.log("hello")
 | 
					                        // logger.log("hello")
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					@ -270,22 +437,16 @@ struct ContentView: View {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    func handleVisibilityChanged(_ id: String, change: VisibilityChange, tracker: VisibilityTracker<String>) {
 | 
				
			||||||
private struct LineRow: View {
 | 
					        switch change {
 | 
				
			||||||
    var line: Line
 | 
					            case .shown: print("\(id) shown")
 | 
				
			||||||
    
 | 
					            case .hidden: print("\(id) hidden")
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var body: some View {
 | 
					 | 
				
			||||||
        HStack {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            //Print("Here I am", line.body)
 | 
					 | 
				
			||||||
            Text(line.body)
 | 
					 | 
				
			||||||
            Spacer()
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        print(tracker.visibleViews)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private let itemFormatter: DateFormatter = {
 | 
					private let itemFormatter: DateFormatter = {
 | 
				
			||||||
| 
						 | 
					@ -303,8 +464,6 @@ struct ContentView_Previews: PreviewProvider {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extension View {
 | 
					extension View {
 | 
				
			||||||
    func Print(_ vars: Any...) -> some View {
 | 
					    func Print(_ vars: Any...) -> some View {
 | 
				
			||||||
        for v in vars { print(v) }
 | 
					        for v in vars { print(v) }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,5 +7,5 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct JsonImport:  Decodable {
 | 
					struct JsonImport:  Decodable {
 | 
				
			||||||
		var lines : [Line]
 | 
							var lines : [Line]
 | 
				
			||||||
		// var segs: [Seg]
 | 
							var segs: [Seg]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,16 +17,6 @@ struct Line: Identifiable, Equatable {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extension Line {
 | 
					extension Line {
 | 
				
			||||||
    private static let names = [
 | 
					 | 
				
			||||||
        "Arthur", "Anita", "Barbara", "Bernard", "Craig", "Chiara", "David",
 | 
					 | 
				
			||||||
        "Dean", "Éric", "Elena", "Fatima", "Frederik", "Gilbert", "Georgette",
 | 
					 | 
				
			||||||
        "Henriette", "Hassan", "Ignacio", "Irene", "Julie", "Jack", "Karl",
 | 
					 | 
				
			||||||
        "Kristel", "Louis", "Liz", "Masashi", "Mary", "Noam", "Nicole",
 | 
					 | 
				
			||||||
        "Ophelie", "Oleg", "Pascal", "Patricia", "Quentin", "Quinn", "Raoul",
 | 
					 | 
				
			||||||
        "Rachel", "Stephan", "Susie", "Tristan", "Tatiana", "Ursule", "Urbain",
 | 
					 | 
				
			||||||
        "Victor", "Violette", "Wilfried", "Wilhelmina", "Yvon", "Yann",
 | 
					 | 
				
			||||||
        "Zazie", "Zoé"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static let books = [
 | 
					    private static let books = [
 | 
				
			||||||
        "John", "Matthew", "Imitation of Christ"]
 | 
					        "John", "Matthew", "Imitation of Christ"]
 | 
				
			||||||
| 
						 | 
					@ -36,16 +26,6 @@ extension Line {
 | 
				
			||||||
    //     Line(id: nil, chap: 1, body: "")
 | 
					    //     Line(id: nil, chap: 1, body: "")
 | 
				
			||||||
    // }
 | 
					    // }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Creates a new player with random name and random score
 | 
					 | 
				
			||||||
    static func makeRandom() -> Line {
 | 
					 | 
				
			||||||
        Line(id: nil, chap: randomScore(), verse: 1, body: randomName(), book: randomBook())
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    /// Returns a random name
 | 
					 | 
				
			||||||
    static func randomName() -> String {
 | 
					 | 
				
			||||||
        names.randomElement()!
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    /// Returns a random score
 | 
					    /// Returns a random score
 | 
				
			||||||
    static func randomScore() -> Int {
 | 
					    static func randomScore() -> Int {
 | 
				
			||||||
        10 * Int.random(in: 0...100)
 | 
					        10 * Int.random(in: 0...100)
 | 
				
			||||||
| 
						 | 
					@ -113,11 +93,3 @@ extension DerivableRequest<Line> {
 | 
				
			||||||
    //        Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
 | 
					    //        Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
 | 
				
			||||||
    //}
 | 
					    //}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  Line.swift
 | 
					 | 
				
			||||||
//  gloss
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  Created by Saint on 2/18/23.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import Foundation
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,85 +0,0 @@
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  Seg.swift
 | 
					 | 
				
			||||||
//  gloss
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  Created by Saint on 2/24/23.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import GRDB
 | 
					 | 
				
			||||||
/// The Line struct.
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// Identifiable conformance supports SwiftUI list animations, and type-safe
 | 
					 | 
				
			||||||
/// GRDB primary key methods.
 | 
					 | 
				
			||||||
/// Equatable conformance supports tests.
 | 
					 | 
				
			||||||
struct Seg: Identifiable, Equatable {
 | 
					 | 
				
			||||||
    /// The player id.
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// Int64 is the recommended type for auto-incremented database ids.
 | 
					 | 
				
			||||||
    /// Use nil for players that are not inserted yet in the database.
 | 
					 | 
				
			||||||
    var id: Int64?
 | 
					 | 
				
			||||||
    var rowids: String
 | 
					 | 
				
			||||||
    var book: String
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extension Seg {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MARK: - Persistence
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// Make Line a Codable Record.
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
 | 
					 | 
				
			||||||
extension Seg: Codable, FetchableRecord, MutablePersistableRecord {
 | 
					 | 
				
			||||||
    // Define database columns from CodingKeys
 | 
					 | 
				
			||||||
    fileprivate enum Columns {
 | 
					 | 
				
			||||||
        static let id = Column(CodingKeys.id)
 | 
					 | 
				
			||||||
        static let rowids = Column(CodingKeys.rowids)
 | 
					 | 
				
			||||||
        static let book = Column(CodingKeys.book)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    /// Updates a player id after it has been inserted in the database.
 | 
					 | 
				
			||||||
    mutating func didInsert(_ inserted: InsertionSuccess) {
 | 
					 | 
				
			||||||
        id = inserted.rowID
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MARK: - Line Database Requests
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// Define some player requests used by the application.
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
 | 
					 | 
				
			||||||
/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
 | 
					 | 
				
			||||||
extension DerivableRequest<Line> {
 | 
					 | 
				
			||||||
    /// A request of players ordered by name.
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// For example:
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    ///     let players: [Line] = try dbWriter.read { db in
 | 
					 | 
				
			||||||
    ///         try Line.all().orderedByName().fetchAll(db)
 | 
					 | 
				
			||||||
    ///     }
 | 
					 | 
				
			||||||
    //func orderedByName() -> Self {
 | 
					 | 
				
			||||||
    //    // Sort by name in a localized case insensitive fashion
 | 
					 | 
				
			||||||
    //    // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison
 | 
					 | 
				
			||||||
    //    order(Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
 | 
					 | 
				
			||||||
    //}
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    ///// A request of players ordered by score.
 | 
					 | 
				
			||||||
    /////
 | 
					 | 
				
			||||||
    ///// For example:
 | 
					 | 
				
			||||||
    /////
 | 
					 | 
				
			||||||
    /////     let players: [Line] = try dbWriter.read { db in
 | 
					 | 
				
			||||||
    /////         try Line.all().orderedByScore().fetchAll(db)
 | 
					 | 
				
			||||||
    /////     }
 | 
					 | 
				
			||||||
    /////     let bestLine: Line? = try dbWriter.read { db in
 | 
					 | 
				
			||||||
    /////         try Line.all().orderedByScore().fetchOne(db)
 | 
					 | 
				
			||||||
    /////     }
 | 
					 | 
				
			||||||
    //func orderedByScore() -> Self {
 | 
					 | 
				
			||||||
    //    // Sort by descending score, and then by name, in a
 | 
					 | 
				
			||||||
    //    // localized case insensitive fashion
 | 
					 | 
				
			||||||
    //    // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison
 | 
					 | 
				
			||||||
    //    order(
 | 
					 | 
				
			||||||
    //        Line.Columns.score.desc,
 | 
					 | 
				
			||||||
    //        Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
 | 
					 | 
				
			||||||
    //}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Loading…
	
		Reference in New Issue