-
Notifications
You must be signed in to change notification settings - Fork 0
/
UML.drawio
176 lines (176 loc) · 25.4 KB
/
UML.drawio
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.36 Electron/32.0.1 Safari/537.36" version="24.7.17">
<diagram id="X4fbAPJycXuXCDoOZpYN" name="Page-1">
<mxGraphModel dx="4220" dy="4772" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="4000" pageHeight="4000" background="none" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="node14" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Album</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> name: string<br/> releaseDatePrecision: &quot;year&quot; | &quot;month&quot; | &quot;day&quot;<br/> releaseDate: Date<br/> totalTracks: number<br/> albumType: string<br/> albumURL: URL<br/> pictureURL: URL<br/> copyright: string<br/> label: string<br/> genres: string[]<br/> artists: Artist[]<br/> tracks: Track[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="1214" y="-1110" width="326" height="351" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.25;entryDx=0;entryDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node3" target="node10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node3" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>App</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> authManager: AuthManager<br/> spotify: Spotify<br/> router: Router</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="863" y="-1249" width="217" height="209" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node6" target="node14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node6" target="node10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node6" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Artist</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> name: string<br/> popularity: number<br/> genres: string[]<br/> followers: number<br/> artistURL: URL<br/> pictureURL: URL</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="910.5" y="-990" width="161" height="207" as="geometry" />
</mxCell>
<mxCell id="node1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ArtistPage</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify, artistID?: string): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> artist: Artist<br/> topTracks: Track[]</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> render(): Promise&lt;void&gt;<br/> renderContent(): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="10" y="37" width="410" height="165" as="geometry" />
</mxCell>
<mxCell id="node13" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ArtistPill</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(artist: Artist): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> artist: Artist</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="1620" y="-550" width="205" height="97" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node8" target="node10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;shadow=0;flowAnimation=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="node8" target="node12">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-290" y="-1177" />
<mxPoint x="-290" y="-215" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node8" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>AuthManager</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> _expiresAt: number<br/> _accessToken: string | null<br/> _refreshToken: string | null<br/> _codeChallenge: string | null<br/> _codeVerifier: string | null<br/> _codeCallback: string | null</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> authenticate(): Promise&lt;void&gt;<br/> refreshTokens(grant_type?: string): Promise&lt;void&gt;<br/> printTokens(): void<br/> isExpired(): boolean<br/> isAuthentified(): true | false<br/> getAccessToken(): string | null<br/> restoreTokens(): boolean<br/> storeAccessToken(): void<br/> storeRefreshToken(): void<br/> storeExpiresAt(): void<br/> handleSpotifyCallback(): Promise&lt;void&gt;<br/> cleanUrlParams(): void<br/> logout(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="270" y="-1440" width="359" height="525" as="geometry" />
</mxCell>
<mxCell id="node11" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Button</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(id: string, text: string, classes: string[], action: () =&gt; void): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="1534" y="-660" width="377" height="68" as="geometry" />
</mxCell>
<mxCell id="node7" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CallbackPage</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> render(): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="90" y="310" width="405" height="97" as="geometry" />
</mxCell>
<mxCell id="node15" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>HomePage</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> connectToSpotify: HTMLButtonElement<br/> particles: HTMLDivElement</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> render(): Promise&lt;void&gt;<br/> handleButtonClick(): void<br/> handleSpotifyAuth(): void<br/> createParticles(num: number): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="429" y="37" width="405" height="213" as="geometry" />
</mxCell>
<mxCell id="node18" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MePage</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> render(): Promise&lt;void&gt;<br/> renderContent(): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="-370" y="291" width="405" height="123" as="geometry" />
</mxCell>
<mxCell id="node12" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Page</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> authManager: AuthManager<br/> spotify: Spotify<br/> container: HTMLElement<br/> topBar: HTMLDivElement<br/> footer: HTMLDivElement</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> render(): Promise&lt;void&gt;<br/> showErrorMessage(error: string): void<br/> setupTopBar(): Promise&lt;void&gt;<br/> createTopbar(): void<br/> setupFooter(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="-210" y="-370" width="405" height="309" as="geometry" />
</mxCell>
<mxCell id="node4" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Playlist</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> name: string<br/> description: string<br/> totalTracks: number<br/> collaborative: boolean<br/> followers: number<br/> owner: User<br/> public: boolean<br/> pictureURL: URL<br/> playlistURL: URL<br/> tracks: {addedAt: Date, addedBy: User, track: T…</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="1540" y="-190" width="348" height="303" as="geometry" />
</mxCell>
<mxCell id="node9" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Router</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> pages: {[p: string]: PageLoader}<br/> authManager: AuthManager<br/> spotify: Spotify<br/> currentPage: Page | null</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> init(): void<br/> getCurrentPage(): string<br/> getParams(hash: string): {[p: string]: string}<br/> navigateTo(pageName: string, params?: any): Promise&lt;void&gt;<br/> handlePopState(): void<br/> renderPage(pageName: string, params?: any): Promise&lt;void&gt;</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="323" y="-360" width="424" height="309" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node10" target="node9">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node10" target="node12">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-29" y="-677" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Spotify</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> authManager: AuthManager<br/> loggedUser: User | null<br/> topArtists: Artist[]<br/> topTracks: Track[]</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> getLoggedUserInfos(): Promise&lt;void&gt;<br/> getLoggedUserTopsItems(): Promise&lt;{topArtists: Artist[], topTrack…<br/> getAlbumInfos(albumId: string): Promise&lt;Album&gt;<br/> getArtistInfos(artistId: string): Promise&lt;Artist&gt;<br/> getTrackInfos(trackId: string): Promise&lt;Track&gt;<br/> getArtistTopTracks(artistId: string): Promise&lt;Track[]&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> headers: {Authorization: string}</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="137" y="-855" width="468" height="355" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node2" target="node14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node2" target="node4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="node2" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Track</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> name: string<br/> duration: number<br/> popularity: number<br/> explicit: boolean<br/> trackNumber: number<br/> imageURL: URL<br/> trackURL: URL<br/> previewURL: URL<br/> artists: Artist[]<br/> album: Album</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="1101" y="-478" width="180" height="303" as="geometry" />
</mxCell>
<mxCell id="node16" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>TrackPage</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(authManager: AuthManager, spotify: Spotify, trackID?: string): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> track: Track</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> render(): Promise&lt;void&gt;<br/> renderContent(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="560" y="330" width="415" height="141" as="geometry" />
</mxCell>
<mxCell id="node0" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>TrackPill</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> constructor(track: Track): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> track: Track</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="1611" y="-330" width="206" height="97" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node17" target="node10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="734" y="-449" />
<mxPoint x="734" y="-620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node17" target="node4">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="945" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="node17" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>User</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"> id: string<br/> name: string<br/> email: string<br/> country: string<br/> followers: number<br/> spotifyPlan: string<br/> pictureURL: URL<br/> userURL: URL<br/> topArtists: Artist[]<br/> topTracks: Track[]<br/> topGenres: Genre[]</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="863" y="-600" width="164" height="303" as="geometry" />
</mxCell>
<mxCell id="edge0" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;" parent="1" source="node1" target="node12" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="215" y="-20" />
<mxPoint x="60" y="-20" />
</Array>
<mxPoint x="-10" y="-40" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="edge1" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;" parent="1" source="node7" target="node12" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="290" y="310" />
<mxPoint x="290" y="233" />
<mxPoint x="-29" y="233" />
</Array>
<mxPoint x="-10" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="edge4" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;" parent="1" source="node15" target="node12" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="632" y="-10" />
<mxPoint x="-29" y="-10" />
</Array>
<mxPoint y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="edge3" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;" parent="1" source="node18" target="node12" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="-168" y="228" />
<mxPoint x="-90" y="228" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="edge2" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.47;exitY=0.009;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="node16" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="750" y="331" />
<mxPoint x="750" y="270" />
<mxPoint x="-29" y="270" />
</Array>
<mxPoint x="1071.5" y="272" as="sourcePoint" />
<mxPoint x="-29" y="-61.999999999999545" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-10" style="edgeStyle=none;curved=1;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node17" target="node17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startSize=8;endSize=8;" edge="1" parent="1" source="node2" target="node10">
<mxGeometry relative="1" as="geometry">
<mxPoint x="660" y="-650" as="targetPoint" />
<Array as="points">
<mxPoint x="1130" y="-660" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="nacot97ET6g6KrgIqpEn-25" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PageLoader</b></p><hr size="1"/>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;fillColor=#a20025;fontColor=#ffffff;strokeColor=#6F0000;" vertex="1" parent="1">
<mxGeometry x="1670" y="-770" width="127" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>