-
Notifications
You must be signed in to change notification settings - Fork 10
/
ch19.html
89 lines (86 loc) · 201 KB
/
ch19.html
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
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<meta name="author" content="郭耀仁" />
<meta name="date" content="2017-08-04" />
<title>機器學習簡介</title>
<style type="text/css">code{white-space: pre;}</style>
<link href="data:text/css;charset=utf-8,%0Abody%0A%7B%0Amargin%3A%200%200%200%200%3B%0Apadding%3A%200%200%200%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Acolor%3A%20black%3B%0Abackground%2Dcolor%3A%20white%3B%0Afont%2Dfamily%3A%20%22Gill%20Sans%20MT%22%2C%20%22Gill%20Sans%22%2C%20GillSans%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0Adiv%2Etoolbar%20%7B%0Aposition%3A%20fixed%3B%20z%2Dindex%3A%20200%3B%0Atop%3A%20auto%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0Aheight%3A%201%2E2em%3B%20text%2Dalign%3A%20right%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%20font%2Dsize%3A%2060%25%3B%0Acolor%3A%20DimGray%3B%0Abackground%2Dcolor%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dtop%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0A%7D%0Adiv%2Etoolbar%20span%2Ecopyright%20%7B%0Acolor%3A%20DimGray%3B%0Amargin%2Dleft%3A%200%2E5em%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%201000%3B%0Abottom%3A%201%2E2em%3B%0Awidth%3A%20100%25%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%29%3B%0Aopacity%3A%200%2E35%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%2C%200%2E35%29%3B%0Acursor%3A%20pointer%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Ehelp%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Eclose%20%7B%0Atext%2Dalign%3A%20right%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%20300%3B%0Awidth%3A%2060%25%3B%0Amax%2Dwidth%3A%2030em%3B%0Aheight%3A%2030em%3B%0Aoverflow%3A%20auto%3B%0Atop%3A%20auto%3B%0Aright%3A%20auto%3B%0Aleft%3A%204em%3B%0Abottom%3A%204em%3B%0Apadding%3A%201em%3B%0Abackground%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dwidth%3A%202px%3B%0Afont%2Dsize%3A%2060%25%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%2Etoc%5Fheading%20%7B%0Atext%2Dalign%3A%20center%3B%0Awidth%3A%20100%25%3B%0Amargin%3A%200%3B%0Amargin%2Dbottom%3A%201em%3B%0Aborder%2Dbottom%2Dstyle%3A%20solid%3B%0Aborder%2Dbottom%2Dcolor%3A%20rgb%28180%2C180%2C180%29%3B%0Aborder%2Dbottom%2Dwidth%3A%201px%3B%0A%7D%0Adiv%2Eslide%20%7B%0Az%2Dindex%3A%2020%3B%0Amargin%3A%200%200%200%200%3B%0Apadding%2Dtop%3A%200%3B%0Apadding%2Dbottom%3A%200%3B%0Apadding%2Dleft%3A%2020px%3B%0Apadding%2Dright%3A%2020px%3B%0Aborder%2Dwidth%3A%200%3B%0Aclear%3A%20both%3B%0Atop%3A%200%3B%0Abottom%3A%200%3B%0Aleft%3A%200%3B%0Aright%3A%200%3B%0Aline%2Dheight%3A%20120%25%3B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0Adiv%2Ebackground%20%7B%0Adisplay%3A%20none%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Amargin%2Dleft%3A%2020px%3B%0Amargin%2Dright%3A%2020px%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20h1%20%7B%0Apadding%2Dtop%3A%2010%25%3B%0Amargin%2Dright%3A%200%3B%0A%7D%0Adiv%2Eslide%20h1%20%7B%0Apadding%2Dleft%3A%200%3B%0Apadding%2Dright%3A%2020pt%3B%0Apadding%2Dtop%3A%204pt%3B%0Apadding%2Dbottom%3A%204pt%3B%0Amargin%2Dtop%3A%200%3B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dright%3A%2060pt%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Adisplay%3A%20block%3B%20font%2Dsize%3A%20160%25%3B%0Aline%2Dheight%3A%201%2E2em%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%201024px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20100%25%3B%20%7D%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%20800px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20200%25%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Atop%3A%201em%3B%0Aleft%3A%201em%3B%0Aright%3A%20auto%3B%0Awidth%3A%2080%25%3B%0Afont%2Dsize%3A%20180%25%3B%0A%7D%0A%7D%0Adiv%2Etoc%2Dheading%20%7B%0Awidth%3A%20100%25%3B%0Aborder%2Dbottom%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0Amargin%2Dbottom%3A%201em%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0Aimage%2Drendering%3A%20optimize%2Dquality%3B%0A%7D%0Apre%20%7B%0Afont%2Dsize%3A%2080%25%3B%0Afont%2Dweight%3A%20bold%3B%0Aline%2Dheight%3A%20120%25%3B%0Apadding%2Dtop%3A%200%2E2em%3B%0Apadding%2Dbottom%3A%200%2E2em%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dleft%2Dwidth%3A%201em%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dright%2Dwidth%3A%20thin%3B%0Aborder%2Dbottom%2Dwidth%3A%20thin%3B%0Aborder%2Dcolor%3A%20%2395ABD0%3B%0Acolor%3A%20%2300428C%3B%0Abackground%2Dcolor%3A%20%23E4E5E7%3B%0A%7D%0Ali%20pre%20%7B%20margin%2Dleft%3A%200%3B%20%7D%0Ablockquote%20%7B%20font%2Dstyle%3A%20italic%20%7D%0Aimg%20%7B%20background%2Dcolor%3A%20transparent%20%7D%0Ap%2Ecopyright%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ecenter%20%7B%20text%2Dalign%3A%20center%20%7D%0A%2Efootnote%20%7B%20font%2Dsize%3A%20smaller%3B%20margin%2Dleft%3A%202em%3B%20%7D%0Aa%20img%20%7B%20border%2Dwidth%3A%200%3B%20border%2Dstyle%3A%20none%20%7D%0Aa%3Avisited%20%7B%20color%3A%20navy%20%7D%0Aa%3Alink%20%7B%20color%3A%20navy%20%7D%0Aa%3Ahover%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%3Aactive%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%20%7Btext%2Ddecoration%3A%20none%7D%0A%2Etoolbar%20a%3Alink%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Avisited%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Aactive%20%7Bcolor%3A%20red%7D%0A%2Etoolbar%20a%3Ahover%20%7Bcolor%3A%20red%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Ali%20%7B%20margin%2Dleft%3A%200%2E5em%3B%20margin%2Dtop%3A%200%2E5em%3B%20%7D%0Ali%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%20%7D%0Ali%20li%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%20%7D%0Adiv%20dt%0A%7B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dtop%3A%201em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%20dd%0A%7B%0Amargin%2Dleft%3A%202em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0A%7D%0Ap%2Cpre%2Cul%2Col%2Cblockquote%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%2Cdl%2Ctable%20%7B%0Amargin%2Dleft%3A%201em%3B%0Amargin%2Dright%3A%201em%3B%0A%7D%0Ap%2Esubhead%20%7B%20font%2Dweight%3A%20bold%3B%20margin%2Dtop%3A%202em%3B%20%7D%0A%2Esmaller%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ebigger%20%7B%20font%2Dsize%3A%20130%25%20%7D%0Atd%2Cth%20%7B%20padding%3A%200%2E2em%20%7D%0Aul%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aol%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20li%20%7B%20list%2Dstyle%3A%20square%3B%0Amargin%3A%200%2E1em%200em%200%2E6em%200%3B%0Apadding%3A%200%200%200%200%3B%0Aline%2Dheight%3A%20140%25%3B%0A%7D%0Aol%20li%20%7B%20margin%3A%200%2E1em%200em%200%2E6em%201%2E5em%3B%0Apadding%3A%200%200%200%200px%3B%0Aline%2Dheight%3A%20140%25%3B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%3B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%3B%0Alist%2Dstyle%2Dtype%3A%20circle%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20li%20ul%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20li%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0A%0Aol%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aol%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aul%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aul%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aol%2Eoutline%20%7B%20list%2Dstyle%3Adecimal%3B%20%7D%0Aol%2Eoutline%20ol%20%7B%20list%2Dstyle%2Dtype%3Alower%2Dalpha%20%7D%0Aol%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0A%0Aa%2Etitleslide%20%7B%20font%2Dweight%3A%20bold%3B%20font%2Dstyle%3A%20italic%20%7D%0A%0Aimg%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Einitial%5Fprompt%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Eslide%20%7B%0Avisibility%3A%20visible%3B%0Aposition%3A%20inherit%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Aborder%2Dtop%2Dstyle%3A%20solid%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dtop%2Dcolor%3A%20black%3B%0A%7D%0A%40media%20screen%20%7B%0A%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ehandout%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Einitial%5Fprompt%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Einvisible%20%7B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Eslide%20%7B%20position%3A%20absolute%20%7D%0Abody%2Esingle%5Fslide%20div%2Ehandout%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0A%7D%0A%40media%20print%20%7B%0A%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%20pre%20%7B%20font%2Dsize%3A%2060%25%3B%20padding%2Dleft%3A%200%2E5em%3B%20%7D%0Adiv%2Etoolbar%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslide%20%7B%20page%2Dbreak%2Dbefore%3A%20always%20%7D%0A%0Adiv%2Eslide%2Efirst%2Dslide%20%7B%20page%2Dbreak%2Dbefore%3A%20avoid%20%7D%0A%7D%0A%0A%0A%2Ejslider%20table%20%7B%0Amargin%2Dleft%3A%200em%3B%0Amargin%2Dright%3A%200em%3B%0A%7D%0A%0Atable%2EdataTable%2C%20%2Eshiny%2Ddatatable%2Doutput%20div%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0A%2EdataTables%5Finfo%2C%20%2EdataTables%5Fpaginate%20%7B%0Afont%2Dsize%3A%2019px%3B%0A%7D%0A%0Apre%2EsourceCode%2C%20code%2EsourceCode%20%7B%0Afont%2Dsize%3A%2080%25%3B%0A%7D%0A%0Alabel%2C%20button%2C%20input%2C%20select%2C%20textarea%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0Aul%2Enav%2C%20ul%2Enav%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,Lyogc2xpZHkuanMKCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDEzIFczQyAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIFczQyBsaWFiaWxpdHksIHRyYWRlbWFyaywgZG9jdW1lbnQgdXNlIGFuZCBzb2Z0d2FyZSBsaWNlbnNpbmcKICAgcnVsZXMgYXBwbHksIHNlZToKCiAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LWRvY3VtZW50cwogICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZQoKICAgRGVmaW5lcyBzaW5nbGUgbmFtZSAidzNjX3NsaWR5IiBpbiBnbG9iYWwgbmFtZXNwYWNlCiAgIEFkZHMgZXZlbnQgaGFuZGxlcnMgd2l0aG91dCB0cmFtcGxpbmcgb24gYW55IG90aGVycwoqLwoKLy8gdGhlIHNsaWR5IG9iamVjdCBpbXBsZW1lbnRhdGlvbgp2YXIgdzNjX3NsaWR5ID0gewogIC8vIGNsYXNzaWZ5IHdoaWNoIGtpbmQgb2YgYnJvd3NlciB3ZSdyZSBydW5uaW5nIHVuZGVyCiAgbnNfcG9zOiAodHlwZW9mIHdpbmRvdy5wYWdlWU9mZnNldCE9J3VuZGVmaW5lZCcpLAogIGtodG1sOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgb3BlcmE6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiT3BlcmEiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGFkOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoImlQYWQiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGhvbmU6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiaVBob25lIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgYW5kcm9pZDogKChuYXZpZ2F0b3IudXNlckFnZW50KS5pbmRleE9mKCJBbmRyb2lkIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgaWU6ICh0eXBlb2YgZG9jdW1lbnQuYWxsICE9ICJ1bmRlZmluZWQiICYmICF0aGlzLm9wZXJhKSwKICBpZTY6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDYiKSAhPSAtMSksCiAgaWU3OiAoIXRoaXMubnNfcG9zICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSA3IikgIT0gLTEpLAogIGllODogKCF0aGlzLm5zX3BvcyAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgOCIpICE9IC0xKSwKICBpZTk6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkiKSAhPSAtMSksCgogIC8vIGRhdGEgZm9yIHN3aXBlIGFuZCBkb3VibGUgdGFwIGRldGVjdGlvbiBvbiB0b3VjaCBzY3JlZW5zCiAgbGFzdF90YXA6IDAsCiAgcHJldl90YXA6IDAsCiAgc3RhcnRfeDogMCwKICBzdGFydF95OiAwLAogIGRlbHRhX3g6IDAsCiAgZGVsdGFfeTogMCwKCiAgLy8gYXJlIHdlIHJ1bm5pbmcgYXMgWEhUTUw/IChkb2Vzbid0IHdvcmsgb24gT3BlcmEpCiAgaXNfeGh0bWw6IC94bWwvLnRlc3QoZG9jdW1lbnQuY29udGVudFR5cGUpLAoKICBzbGlkZV9udW1iZXI6IDAsIC8vIGludGVnZXIgc2xpZGUgY291bnQ6IDAsIDEsIDIsIC4uLgogIHNsaWRlX251bWJlcl9lbGVtZW50OiBudWxsLCAvLyBlbGVtZW50IGNvbnRhaW5pbmcgc2xpZGUgbnVtYmVyCiAgc2xpZGVzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIHNsaWRlIGRpdidzCiAgbm90ZXM6IFtdLCAvLyBzZXQgdG8gYXJyYXkgb2YgaGFuZG91dCBkaXYncwogIGJhY2tncm91bmRzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIGJhY2tncm91bmQgZGl2J3MKICBvYnNlcnZlcnM6IFtdLCAvLyBsaXN0IG9mIG9ic2VydmVyIGZ1bmN0aW9ucwogIHRvb2xiYXI6IG51bGwsIC8vIGVsZW1lbnQgY29udGFpbmluZyB0b29sYmFyCiAgdGl0bGU6IG51bGwsIC8vIGRvY3VtZW50IHRpdGxlCiAgbGFzdF9zaG93bjogbnVsbCwgLy8gbGFzdCBpbmNyZW1lbnRhbGx5IHNob3duIGl0ZW0KICBlb3M6IG51bGwsICAvLyBzcGFuIGVsZW1lbnQgZm9yIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKICB0b2M6IG51bGwsIC8vIHRhYmxlIG9mIGNvbnRlbnRzCiAgb3V0bGluZTogbnVsbCwgLy8gb3V0bGluZSBlbGVtZW50IHdpdGggdGhlIGZvY3VzCiAgc2VsZWN0ZWRfdGV4dF9sZW46IDAsIC8vIGxlbmd0aCBvZiBkcmFnIHNlbGVjdGlvbiBvbiBkb2N1bWVudAogIHZpZXdfYWxsOiAwLCAgLy8gMSB0byB2aWV3IGFsbCBzbGlkZXMgKyBoYW5kb3V0cwogIHdhbnRfdG9vbGJhcjogdHJ1ZSwgIC8vIHVzZXIgcHJlZmVyZW5jZSB0byBzaG93L2hpZGUgdG9vbGJhcgogIG1vdXNlX2NsaWNrX2VuYWJsZWQ6IHRydWUsIC8vIGVuYWJsZXMgbGVmdCBjbGljayBmb3IgbmV4dCBzbGlkZQogIHNjcm9sbF9oYWNrOiAwLCAvLyBJRSB3b3JrIGFyb3VuZCBmb3IgcG9zaXRpb246IGZpeGVkCiAgZGlzYWJsZV9zbGlkZV9jbGljazogZmFsc2UsICAvLyB1c2VkIGJ5IGNsaWNrZWQgYW5jaG9ycwoKICBsYW5nOiAiZW4iLCAvLyB1cGRhdGVkIHRvIGxhbmd1YWdlIHNwZWNpZmllZCBieSBodG1sIGZpbGUKCiAgaGVscF9hbmNob3I6IG51bGwsIC8vIHVzZWQgZm9yIGtleWJvYXJkIGZvY3VzIGhhY2sgaW4gc2hvd1Rvb2xiYXIoKQogIGhlbHBfcGFnZTogImh0dHA6Ly93d3cudzMub3JnL1RhbGtzL1Rvb2xzL1NsaWR5Mi9oZWxwL2hlbHAuaHRtbCIsCiAgaGVscF90ZXh0OiAiTmF2aWdhdGUgd2l0aCBtb3VzZSBjbGljaywgc3BhY2UgYmFyLCBDdXJzb3IgTGVmdC9SaWdodCwgIiArCiAgICAgICAgICAgICAib3IgUGcgVXAgYW5kIFBnIERuLiBVc2UgUyBhbmQgQiB0byBjaGFuZ2UgZm9udCBzaXplLiIsCgogIHNpemVfaW5kZXg6IDAsCiAgc2l6ZV9hZGp1c3RtZW50OiAwLAogIHNpemVzOiAgbmV3IEFycmF5KCIxMHB0IiwgIjEycHQiLCAiMTRwdCIsICIxNnB0IiwgIjE4cHQiLCAiMjBwdCIsCiAgICAgICAgICAgICAgICAgICAgIjIycHQiLCAiMjRwdCIsICIyNnB0IiwgIjI4cHQiLCAiMzBwdCIsICIzMnB0IiksCgogIC8vIG5lZWRlZCBmb3IgZWZmaWNpZW50IHJlc2l6aW5nCiAgbGFzdF93aWR0aDogMCwKICBsYXN0X2hlaWdodDogMCwKCgogIC8vIE5lZWRlZCBmb3IgY3Jvc3MgYnJvd3NlciBzdXBwb3J0IGZvciByZWxhdGl2ZSB3aWR0aC9oZWlnaHQgb24KICAvLyBvYmplY3QgZWxlbWVudHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBzYXZlIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzCiAgLy8gYW5kIHRoZW4gdG8gcmVjb21wdXRlIGFic29sdXRlIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zIG9uIHJlc2l6aW5nCiAgIG9iamVjdHM6IFtdLAoKICAvLyBhdHRhY2ggaW5pdGlhbGlhdGlvbiBldmVudCBoYW5kbGVycwogIHNldF91cDogZnVuY3Rpb24gKCkgewogICAgdmFyIGluaXQgPSBmdW5jdGlvbigpIHsgdzNjX3NsaWR5LmluaXQoKTsgfTsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT0gInVuZGVmaW5lZCIpCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgaW5pdCwgZmFsc2UpOwogICAgZWxzZQogICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsIGluaXQpOwogIH0sCgogIGhpZGVfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAhdzNjX3NsaWR5LmluaXRpYWxpemVkKQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgIGVsc2UKICAgICAgc2V0VGltZW91dCh3M2Nfc2xpZHkuaGlkZV9zbGlkZXMsIDUwKTsKICB9LAoKICAvLyBoYWNrIHRvIHBlcnN1YWRlIElFIHRvIGNvbXB1dGUgY29ycmVjdCBkb2N1bWVudCBoZWlnaHQKICAvLyBhcyBuZWVkZWQgZm9yIHNpbXVsYXRpbmcgZml4ZWQgcG9zaXRpb25pbmcgb2YgdG9vbGJhcgogIGllX2hhY2s6IGZ1bmN0aW9uICgpIHsKICAgIHdpbmRvdy5yZXNpemVCeSgwLC0xKTsKICAgIHdpbmRvdy5yZXNpemVCeSgwLCAxKTsKICB9LAoKICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAvL2FsZXJ0KCJzbGlkeSBzdGFydGluZyB0ZXN0IDEwIik7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICB0aGlzLmluaXRfbG9jYWxpemF0aW9uKCk7CiAgICB0aGlzLmFkZF90b29sYmFyKCk7CiAgICB0aGlzLndyYXBfaW1wbGljaXRfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfbm90ZXMoKTsKICAgIHRoaXMuY29sbGVjdF9iYWNrZ3JvdW5kcygpOwogICAgdGhpcy5vYmplY3RzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CiAgICB0aGlzLnBhdGNoX2FuY2hvcnMoKTsKICAgIHRoaXMuc2xpZGVfbnVtYmVyID0gdGhpcy5maW5kX3NsaWRlX251bWJlcihsb2NhdGlvbi5ocmVmKTsKICAgIHdpbmRvdy5vZmZzY3JlZW5idWZmZXJpbmcgPSB0cnVlOwogICAgdGhpcy5zaXplX2FkanVzdG1lbnQgPSB0aGlzLmZpbmRfc2l6ZV9hZGp1c3QoKTsKICAgIHRoaXMudGltZV9sZWZ0ID0gdGhpcy5maW5kX2R1cmF0aW9uKCk7CiAgICB0aGlzLmhpZGVfaW1hZ2VfdG9vbGJhcigpOyAgLy8gc3VwcHJlc3MgSUUgaW1hZ2UgdG9vbGJhciBwb3B1cAogICAgdGhpcy5pbml0X291dGxpbmVyKCk7ICAvLyBhY3RpdmF0ZSBmb2xkL3VuZm9sZCBzdXBwb3J0CiAgICB0aGlzLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7CiAgICB0aGlzLmtleWJvYXJkbGVzcyA9ICh0aGlzLmlwYWR8fHRoaXMuaXBob25lfHx0aGlzLmFuZHJvaWQpOwoKICAgIGlmICh0aGlzLmtleWJvYXJkbGVzcykKICAgIHsKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgIHRoaXMud2FudF90b29sYmFyID0gMDsKICAgIH0KCiAgICAvLyB3b3JrIGFyb3VuZCBmb3Igb3BlcmEgYnVnCiAgICB0aGlzLmlzX3hodG1sID0gKGRvY3VtZW50LmJvZHkudGFnTmFtZSA9PSAiQk9EWSIgPyBmYWxzZSA6IHRydWUpOwoKICAgIGlmICh0aGlzLnNsaWRlcy5sZW5ndGggPiAwKQogICAgewogICAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1t0aGlzLnNsaWRlX251bWJlcl07CiAgIAogICAgICBpZiAodGhpcy5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgICAgICAgdGhpcy5zZXRfZW9zX3N0YXR1cyh0cnVlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKCF0aGlzLm5leHRfaW5jcmVtZW50YWxfaXRlbSh0aGlzLmxhc3Rfc2hvd24pKTsKICAgICAgfQoKICAgICAgdGhpcy5zZXRfbG9jYXRpb24oKTsKICAgICAgdGhpcy5hZGRfY2xhc3ModGhpcy5zbGlkZXNbMF0sICJmaXJzdC1zbGlkZSIpOwogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZShzbGlkZSk7CiAgICB9CgogICAgdGhpcy50b2MgPSB0aGlzLnRhYmxlX29mX2NvbnRlbnRzKCk7CgogICAgdGhpcy5hZGRfaW5pdGlhbF9wcm9tcHQoKTsKCiAgICAvLyBiaW5kIGV2ZW50IGhhbmRsZXJzIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBjdXN0b20gcGFnZSBzY3JpcHRzCiAgICAvLyBUYXAgZXZlbnRzIGJlaGF2ZSB0b28gd2VpcmRseSB0byBzdXBwb3J0IGNsaWNrcyByZWxpYWJseSBvbgogICAgLy8gaVBob25lIGFuZCBpUGFkLCBzbyBleGNsdWRlIHRoZXNlIGZyb20gY2xpY2sgaGFuZGxlcgoKICAgIGlmICghdGhpcy5rZXlib2FyZGxlc3MpCiAgICB7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIHRoaXMubW91c2VfYnV0dG9uX2NsaWNrKTsKICAgICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNlZG93biIsIHRoaXMubW91c2VfYnV0dG9uX2Rvd24pOwogICAgfQoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAia2V5ZG93biIsIHRoaXMua2V5X2Rvd24pOwogICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMua2V5X3ByZXNzKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInJlc2l6ZSIsIHRoaXMucmVzaXplZCk7CiAgICB0aGlzLmFkZF9saXN0ZW5lcih3aW5kb3csICJzY3JvbGwiLCB0aGlzLnNjcm9sbGVkKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInVubG9hZCIsIHRoaXMudW5sb2FkZWQpOwoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAiZ2VzdHVyZWNoYW5nZSIsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIHRoaXMuYXR0YWNoX3RvdWNoX2hhbmRlcnModGhpcy5zbGlkZXMpOwoKICAgIC8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWJ1Z2dpbmcgaGFjawogICAgLy9pZiAoIWRvY3VtZW50LmJvZHkub25jbGljaykKICAgIC8vICBkb2N1bWVudC5ib2R5Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IH07CgogICAgdGhpcy5zaW5nbGVfc2xpZGVfdmlldygpOwoKICAgIC8vdGhpcy5zZXRfbG9jYXRpb24oKTsKCiAgICB0aGlzLnJlc2l6ZWQoKTsKCiAgICBpZiAodGhpcy5pZTcpCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CgogICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKCiAgICAvLyBmb3IgYmFjayBidXR0b24gZGV0ZWN0aW9uCiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHczY19zbGlkeS5jaGVja19sb2NhdGlvbigpOyB9LCAyMDApOwogICAgdzNjX3NsaWR5LmluaXRpYWxpemVkID0gdHJ1ZTsKICB9LAoKICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgd2l0aCBsaW5rcyB0byBlYWNoIHNsaWRlCiAgdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0b2MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuYWRkX2NsYXNzKHRvYywgInNsaWR5X3RvYyBoaWRkZW4iKTsKICAgIC8vdG9jLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwoKICAgIHZhciBoZWFkaW5nID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmFkZF9jbGFzcyhoZWFkaW5nLCAidG9jLWhlYWRpbmciKTsKICAgIGhlYWRpbmcuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiVGFibGUgb2YgQ29udGVudHMiKTsKCiAgICB0b2MuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CiAgICB2YXIgcHJldmlvdXMgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIHZhciB0aXRsZSA9IHRoaXMuaGFzX2NsYXNzKHRoaXMuc2xpZGVzW2ldLCAidGl0bGUiKTsKICAgICAgdmFyIG51bSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKChpICsgMSkgKyAiLiAiKTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChudW0pOwoKICAgICAgdmFyIGEgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgIiMoIiArIChpKzEpICsgIikiKTsKCiAgICAgIGlmICh0aXRsZSkKICAgICAgICB0aGlzLmFkZF9jbGFzcyhhLCAidGl0bGVzbGlkZSIpOwoKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnNsaWRlX25hbWUoaSkpOwogICAgICBhLmFwcGVuZENoaWxkKG5hbWUpOwogICAgICBhLm9uY2xpY2sgPSB3M2Nfc2xpZHkudG9jX2NsaWNrOwogICAgICBhLm9ua2V5ZG93biA9IHczY19zbGlkeS50b2Nfa2V5X2Rvd247CiAgICAgIGEucHJldmlvdXMgPSBwcmV2aW91czsKCiAgICAgIGlmIChwcmV2aW91cykKICAgICAgICBwcmV2aW91cy5uZXh0ID0gYTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChhKTsKCiAgICAgIGlmIChpID09IDApCiAgICAgICAgdG9jLmZpcnN0ID0gYTsKCiAgICAgIGlmIChpIDwgdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSkKICAgICAgewogICAgICAgIHZhciBiciA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImJyIik7CiAgICAgICAgdG9jLmFwcGVuZENoaWxkKGJyKTsKICAgICAgfQoKICAgICAgcHJldmlvdXMgPSBhOwogICAgfQoKICAgIHRvYy5mb2N1cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRoaXMuZmlyc3QpCiAgICAgICAgdGhpcy5maXJzdC5mb2N1cygpOwogICAgfQoKICAgIHRvYy5vbm1vdXNldXAgPSB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX3VwOwoKICAgIHRvYy5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgZXx8KGU9d2luZG93LmV2ZW50KTsKCiAgICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPD0gMCkKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CgogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgIAogICAgICBpZiAoZS5jYW5jZWwgIT0gdW5kZWZpbmVkKQogICAgICAgIGUuY2FuY2VsID0gdHJ1ZTsKICAgICAgCiAgICAgIGlmIChlLnJldHVyblZhbHVlICE9IHVuZGVmaW5lZCkKICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIAogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHRvYywgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsKICAgIHJldHVybiB0b2M7CiAgfSwKCiAgaXNfc2hvd25fdG9jOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gIXczY19zbGlkeS5oYXNfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogIH0sCgogIHNob3dfdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogICAgdmFyIHRvYyA9IHczY19zbGlkeS50b2M7CiAgICB0b2MuZm9jdXMoKTsKCiAgICBpZiAodzNjX3NsaWR5LmllNyAmJiB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID09IDApCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CiAgfSwKCiAgaGlkZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKGZvY3VzKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKTsKCiAgICBpZiAoZm9jdXMgJiYgIXczY19zbGlkeS5vcGVyYSAmJgogICAgICAgICF3M2Nfc2xpZHkuaGFzX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKSkKICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogIH0sCgogIHRvZ2dsZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5pc19zaG93bl90b2MoKSkKICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CiAgICBlbHNlCiAgICAgIHczY19zbGlkeS5zaG93X3RhYmxlX29mX2NvbnRlbnRzKCk7CiAgfSwKCiAgLy8gY2FsbGVkIG9uIGNsaWNraW5nIHRvYyBlbnRyeQogIHRvY19jbGljazogZnVuY3Rpb24gKGUpIHsKICAgIGlmICghZSkKICAgICAgZSA9IHdpbmRvdy5ldmVudDsKCiAgICB2YXIgdGFyZ2V0ID0gdzNjX3NsaWR5LmdldF90YXJnZXQoZSk7CgogICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMSkKICAgIHsKICAgICAgdmFyIHVyaSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCiAgICAgIGlmICh1cmkpCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJnb2luZyB0byAiICsgdXJpKTsKICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LmZpbmRfc2xpZGVfbnVtYmVyKHVyaSk7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgIC8vdGFyZ2V0LmZvY3VzKCk7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgIGlmICghdzNjX3NsaWR5Lm9wZXJhKQogICAgICAgICAgICB3M2Nfc2xpZHkuc2V0X2ZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKICAgIGlmICh3M2Nfc2xpZHkuaWU3KSB3M2Nfc2xpZHkuaWVfaGFjaygpOwogICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChlKTsKICB9LAoKICAvLyBjYWxsZWQgb25rZXlkb3duIGZvciB0b2MgZW50cnkKICB0b2Nfa2V5X2Rvd246IGZ1bmN0aW9uIChldmVudCkgewogICAgdmFyIGtleTsKCiAgICBpZiAoIWV2ZW50KQogICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgZWxzZSBpZiAoZXZlbnQud2hpY2gpCiAgICAgIGtleSA9IGV2ZW50LndoaWNoOwogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgcmV0dXJuIHRydWU7CgogICAgLy8gY2hlY2sgZm9yIGNvbmN1cnJlbnQgY29udHJvbC9jb21tYW5kL2FsdCBrZXkKICAgIC8vIGJ1dCBhcmUgdGhlc2Ugb25seSBwcmVzZW50IG9uIG1vdXNlIGV2ZW50cz8KCiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChrZXkgPT0gMTMpCiAgICB7CiAgICAgIHZhciB1cmkgPSB0aGlzLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoKICAgICAgaWYgKHVyaSkKICAgICAgewogICAgICAgIC8vYWxlcnQoImdvaW5nIHRvICIgKyB1cmkpOwogICAgICAgdmFyIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5maW5kX3NsaWRlX251bWJlcih1cmkpOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7CiAgICAgICAgdzNjX3NsaWR5LnNldF9sb2NhdGlvbigpOwogICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cyghdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbSh3M2Nfc2xpZHkubGFzdF9zaG93bikpOwogICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAvL3RhcmdldC5mb2N1cygpOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICBpZiAoIXczY19zbGlkeS5vcGVyYSkKICAgICAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgfQogICAgICB9CgogICAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKCiAgICAgIGlmIChzZWxmLmllNykKICAgICAgIHczY19zbGlkeS5pZV9oYWNrKCk7CgogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSA0MCAmJiB0aGlzLm5leHQpCiAgICB7CiAgICAgIHRoaXMubmV4dC5mb2N1cygpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSAzOCAmJiB0aGlzLnByZXZpb3VzKQogICAgewogICAgICB0aGlzLnByZXZpb3VzLmZvY3VzKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICB0b3VjaHN0YXJ0OiBmdW5jdGlvbiAoZSkKICB7CiAgICAvLyBhIGRvdWJsZSB0b3VjaCBvZnRlbiBzdGFydHMgd2l0aCBhCiAgICAvLyBzaW5nbGUgdG91Y2ggZHVlIHRvIGZpbmdlcnMgdG91Y2hpbmcKICAgIC8vIGRvd24gYXQgc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzCiAgICAvLyB0aHVzIGF2b2lkIGNhbGxpbmcgcHJldmVudERlZmF1bHQgaGVyZQogICAgdGhpcy5wcmV2X3RhcCA9IHRoaXMubGFzdF90YXA7CiAgICB0aGlzLmxhc3RfdGFwID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgogICAgdmFyIHRhcF9kZWxheSA9IHRoaXMubGFzdF90YXAgLSB0aGlzLnByZXZfdGFwOwoKICAgIGlmICh0YXBfZGVsYXkgPD0gMjAwKQogICAgewogICAgICAvLyBkb3VibGUgdGFwCiAgICB9CgogICAgdmFyIHRvdWNoID0gZS50b3VjaGVzWzBdOwoKICAgIHRoaXMucGFnZVggPSB0b3VjaC5wYWdlWDsKICAgIHRoaXMucGFnZVkgPSB0b3VjaC5wYWdlWTsKICAgIHRoaXMuc2NyZWVuWCA9IHRvdWNoLnNjcmVlblg7CiAgICB0aGlzLnNjcmVlblkgPSB0b3VjaC5zY3JlZW5ZOwogICAgdGhpcy5jbGllbnRYID0gdG91Y2guY2xpZW50WDsKICAgIHRoaXMuY2xpZW50WSA9IHRvdWNoLmNsaWVudFk7CgogICAgdGhpcy5kZWx0YV94ID0gdGhpcy5kZWx0YV95ID0gMDsKICB9LAoKICB0b3VjaG1vdmU6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIG92ZXJyaWRlIG5hdGl2ZSBnZXN0dXJlcyBmb3Igc2luZ2xlIHRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07CiAgICB0aGlzLmRlbHRhX3ggPSB0b3VjaC5wYWdlWCAtIHRoaXMucGFnZVg7CiAgICB0aGlzLmRlbHRhX3kgPSB0b3VjaC5wYWdlWSAtIHRoaXMucGFnZVk7CiAgfSwKCiAgdG91Y2hlbmQ6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgZm9yIG11bHRpLXRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICB2YXIgZGVsYXkgPSAobmV3IERhdGUpLmdldFRpbWUoKSAtIHRoaXMubGFzdF90YXA7CiAgICB2YXIgZHggPSB0aGlzLmRlbHRhX3g7CiAgICB2YXIgZHkgPSB0aGlzLmRlbHRhX3k7CiAgICB2YXIgYWJzX2R4ID0gTWF0aC5hYnMoZHgpOwogICAgdmFyIGFic19keSA9IE1hdGguYWJzKGR5KTsKCiAgICBpZiAoZGVsYXkgPCA1MDAgJiYgKGFic19keCA+IDEwMCB8fCBhYnNfZHkgPiAxMDApKQogICAgewogICAgICBpZiAoYWJzX2R4ID4gMC41ICogYWJzX2R5KQogICAgICB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBpZiAoZHggPCAwKQogICAgICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUodHJ1ZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgdzNjX3NsaWR5LnByZXZpb3VzX3NsaWRlKHRydWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGFic19keSA+IDIgKiBhYnNfZHgpCiAgICAgIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGJlZm9yZV9wcmludDogZnVuY3Rpb24gKCkgewogICAgdGhpcy5zaG93X2FsbF9zbGlkZXMoKTsKICAgIHRoaXMuaGlkZV90b29sYmFyKCk7CiAgICBhbGVydCgiYmVmb3JlIHByaW50Iik7CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGFmdGVyX3ByaW50OiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMudmlld19hbGwpCiAgICB7CiAgICAgIHRoaXMuc2luZ2xlX3NsaWRlX3ZpZXcoKTsKICAgICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKICAgIH0KICAgIGFsZXJ0KCJhZnRlciBwcmludCIpOwogIH0sCgogIC8vICMjIyBPQlNPTEVURSAjIyMKICBwcmludF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYmVmb3JlX3ByaW50KCk7CiAgICB3aW5kb3cucHJpbnQoKTsKICAgIHRoaXMuYWZ0ZXJfcHJpbnQoKTsKICB9LAoKICAvLyAjIyMgT0JTT0xFVEUgPz8gIyMjCiAgdG9nZ2xlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLnZpZXdfYWxsKQogICAgewogICAgICB0aGlzLnNpbmdsZV9zbGlkZV92aWV3KCk7CiAgICAgIHRoaXMuc2hvd190b29sYmFyKCk7CiAgICAgIHRoaXMudmlld19hbGwgPSAwOwogICAgfQogICAgZWxzZQogICAgewogICAgICB0aGlzLnNob3dfYWxsX3NsaWRlcygpOwogICAgICB0aGlzLmhpZGVfdG9vbGJhcigpOwogICAgICB0aGlzLnZpZXdfYWxsID0gMTsKICAgIH0KICB9LAoKICAvLyBwcmVwYXJlIGZvciBwcmludGluZyAgIyMjIE9CU09MRVRFICMjIwogIHNob3dfYWxsX3NsaWRlczogZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW1vdmVfY2xhc3MoZG9jdW1lbnQuYm9keSwgInNpbmdsZV9zbGlkZSIpOwogICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICB9LAoKICAvLyByZXN0b3JlIGFmdGVyIHByaW50aW5nICAjIyMgT0JTT0xFVEUgIyMjCiAgc2luZ2xlX3NsaWRlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYWRkX2NsYXNzKGRvY3VtZW50LmJvZHksICJzaW5nbGVfc2xpZGUiKTsKICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgfSwKCiAgLy8gc3VwcHJlc3MgSUUncyBpbWFnZSB0b29sYmFyIHBvcCB1cAogIGhpZGVfaW1hZ2VfdG9vbGJhcjogZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLm5zX3BvcykKICAgIHsKICAgICAgdmFyIGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJTUciKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKQogICAgICAgIGltYWdlc1tpXS5zZXRBdHRyaWJ1dGUoImdhbGxlcnlpbWciLCAibm8iKTsKICAgIH0KICB9LAoKICB1bmxvYWRlZDogZnVuY3Rpb24gKGUpIHsKICAgIC8vYWxlcnQoInVubG9hZGVkIik7CiAgfSwKCiAgLy8gU2FmYXJpIGFuZCBLb25xdWVyb3IgZG9uJ3QgeWV0IHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSgpCiAgLy8gYW5kIHRoZXkgYWx3YXlzIHJlbG9hZCBwYWdlIHdoZW4gbG9jYXRpb24uaHJlZiBpcyB1cGRhdGVkCiAgaXNfS0hUTUw6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBhZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICByZXR1cm4gKGFnZW50LmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSk7CiAgfSwKCiAgLy8gZmluZCBzbGlkZSBuYW1lIGZyb20gZmlyc3QgaDEgZWxlbWVudAogIC8vIGRlZmF1bHQgdG8gZG9jdW1lbnQgdGl0bGUgKyBzbGlkZSBudW1iZXIKICBzbGlkZV9uYW1lOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgIHZhciBuYW1lID0gbnVsbDsKICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XTsKCiAgICB2YXIgaGVhZGluZyA9IHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKTsKCiAgICBpZiAoaGVhZGluZykKICAgICAgbmFtZSA9IHRoaXMuZXh0cmFjdF90ZXh0KGhlYWRpbmcpOwoKICAgIGlmICghbmFtZSkKICAgICAgbmFtZSA9IHRoaXMudGl0bGUgKyAiKCIgKyAoaW5kZXggKyAxKSArICIpIjsKCiAgICBuYW1lLnJlcGxhY2UoL1wmL2csICImYW1wOyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPC9nLCAiJmx0OyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPi9nLCAiJmd0OyIpOwoKICAgIHJldHVybiBuYW1lOwogIH0sCgogIC8vIGZpbmQgZmlyc3QgaDEgZWxlbWVudCBpbiBET00gdHJlZQogIGZpbmRfaGVhZGluZzogZnVuY3Rpb24gKG5vZGUpIHsKICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBudWxsOwoKICAgIGlmIChub2RlLm5vZGVOYW1lID09ICJIMSIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiaDEiKQogICAgICByZXR1cm4gbm9kZTsKCiAgICB2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkKQogICAgewogICAgICBub2RlID0gdGhpcy5maW5kX2hlYWRpbmcoY2hpbGQpOwoKICAgICAgaWYgKG5vZGUpCiAgICAgICAgcmV0dXJuIG5vZGU7CgogICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIC8vIHJlY3Vyc2l2ZWx5IGV4dHJhY3QgdGV4dCBmcm9tIERPTSB0cmVlCiAgZXh0cmFjdF90ZXh0OiBmdW5jdGlvbiAobm9kZSkgewogICAgaWYgKCFub2RlKQogICAgICByZXR1cm4gIiI7CgogICAgLy8gdGV4dCBub2RlcwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgcmV0dXJuIG5vZGUubm9kZVZhbHVlOwoKICAgIC8vIGVsZW1lbnRzCiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKQogICAgewogICAgICBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgICB2YXIgdGV4dCA9ICIiOwoKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB0ZXh0ID0gdGV4dCArIHRoaXMuZXh0cmFjdF90ZXh0KG5vZGUpOwogICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICB9CgogICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICByZXR1cm4gIiI7CiAgfSwKCiAgLy8gZmluZCBjb3B5cmlnaHQgdGV4dCBmcm9tIG1ldGEgZWxlbWVudAogIGZpbmRfY29weXJpZ2h0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmFtZSwgY29udGVudDsKICAgIHZhciBtZXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIG5hbWUgPSBtZXRhW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwogICAgICBjb250ZW50ID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoImNvbnRlbnQiKTsKCiAgICAgIGlmIChuYW1lID09ICJjb3B5cmlnaHQiKQogICAgICAgIHJldHVybiBjb250ZW50OwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIGZpbmRfc2l6ZV9hZGp1c3Q6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZm9udC1zaXplLWFkanVzdG1lbnQiKQogICAgICAgIHJldHVybiAxICogY29udGVudDsKICAgIH0KCiAgICByZXR1cm4gMTsKICB9LAoKICAvLyA8bWV0YSBuYW1lPSJkdXJhdGlvbiIgY29udGVudD0iMjAiIC8+ICBmb3IgMjAgbWludXRlcwogIGZpbmRfZHVyYXRpb246IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZHVyYXRpb24iKQogICAgICAgIHJldHVybiA2MDAwMCAqIGNvbnRlbnQ7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfSwKCiAgcmVwbGFjZV9ieV9ub25fYnJlYWtpbmdfc3BhY2U6IGZ1bmN0aW9uIChzdHIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKQogICAgICBzdHJbaV0gPSAxNjA7CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBpcyB1c2Ugb2YgImxpIiBva2F5IGZvciB0ZXh0L2h0bWw/CiAgLy8gZm9yIFhIVE1MIGRvIHdlIGFsc28gbmVlZCB0byBzcGVjaWZ5IG5hbWVzcGFjZT8KICBpbml0X291dGxpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGkiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKQogICAgewogICAgICB2YXIgdGFyZ2V0ID0gaXRlbXNbaV07CgogICAgICBpZiAoIXRoaXMuaGFzX2NsYXNzKHRhcmdldC5wYXJlbnROb2RlLCAib3V0bGluZSIpKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgdGFyZ2V0Lm9uY2xpY2sgPSB0aGlzLm91dGxpbmVfY2xpY2s7Ci8qICMjIyBtb3JlIHdvcmsgbmVlZGVkIGZvciBJRTYKICAgICAgaWYgKCF0aGlzLm5zX3BvcykKICAgICAgewogICAgICAgIHRhcmdldC5vbm1vdXNlb3ZlciA9IHRoaXMuaG92ZXJfb3V0bGluZTsKICAgICAgICB0YXJnZXQub25tb3VzZW91dCA9IHRoaXMudW5ob3Zlcl9vdXRsaW5lOwogICAgICB9CiovCiAgICAgIGlmICh0aGlzLmZvbGRhYmxlKHRhcmdldCkpCiAgICAgIHsKICAgICAgICB0YXJnZXQuZm9sZGFibGUgPSB0cnVlOwogICAgICAgIHRhcmdldC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge3czY19zbGlkeS5vdXRsaW5lID0gdGhpczt9OwogICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7dzNjX3NsaWR5Lm91dGxpbmUgPSBudWxsO307CgogICAgICAgIGlmICghdGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkKICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKCiAgICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKHRhcmdldCwgImV4cGFuZCIpKQogICAgICAgICAgdGhpcy51bmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmZvbGQodGFyZ2V0KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmFkZF9jbGFzcyh0YXJnZXQsICJub2ZvbGQiKTsKICAgICAgICB0YXJnZXQudmlzaWJsZSA9IHRydWU7CiAgICAgICAgdGFyZ2V0LmZvbGRhYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9LAoKICBmb2xkYWJsZTogZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmICghaXRlbSB8fCBpdGVtLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgbm9kZSA9IGl0ZW0uZmlyc3RDaGlsZDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKQogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICBmb2xkOiBmdW5jdGlvbiAoaXRlbSkgewogICAgaWYgKGl0ZW0pCiAgICB7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJ1bmZvbGRlZCIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhpdGVtLCAiZm9sZGVkIik7CiAgICB9CgogICAgdmFyIG5vZGUgPSBpdGVtID8gaXRlbS5maXJzdENoaWxkIDogbnVsbDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKSAvLyBlbGVtZW50CiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyhub2RlLCAiaGlkZGVuIik7CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgfQoKICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICB1bmZvbGQ6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICBpZiAoaXRlbSkKICAgIHsKICAgICAgdGhpcy5hZGRfY2xhc3MoaXRlbSwgInVuZm9sZGVkIik7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJmb2xkZWQiKTsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGl0ZW0gPyBpdGVtLmZpcnN0Q2hpbGQgOiBudWxsOwoKICAgIHdoaWxlIChub2RlKQogICAgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIHRoaXMuaXNfYmxvY2sobm9kZSkpIC8vIGVsZW1lbnQKICAgICAgewogICAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImhpZGRlbiIpOwogICAgICB9CgogICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICBpdGVtLnZpc2libGUgPSB0cnVlOwogIH0sCgogIG91dGxpbmVfY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgdmFyIHJpZ2h0Y2xpY2sgPSBmYWxzZTsKICAgIHZhciB0YXJnZXQgPSB3M2Nfc2xpZHkuZ2V0X3RhcmdldChlKTsKCiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC52aXNpYmxlID09IHVuZGVmaW5lZCkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChlLndoaWNoKQogICAgICByaWdodGNsaWNrID0gKGUud2hpY2ggPT0gMyk7CiAgICBlbHNlIGlmIChlLmJ1dHRvbikKICAgICAgcmlnaHRjbGljayA9IChlLmJ1dHRvbiA9PSAyKTsKCiAgICBpZiAoIXJpZ2h0Y2xpY2sgJiYgdGFyZ2V0LnZpc2libGUgIT0gdW5kZWZpbmVkKQogICAgewogICAgICBpZiAodGFyZ2V0LmZvbGRhYmxlKQogICAgICB7CiAgICAgICAgaWYgKHRhcmdldC52aXNpYmxlKQogICAgICAgICAgdzNjX3NsaWR5LmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHRhcmdldCk7CiAgICAgIH0KCiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgYWRkX2luaXRpYWxfcHJvbXB0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICBwcm9tcHQuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJpbml0aWFsX3Byb21wdCIpOwoKICAgIHZhciBwMSA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoInAiKTsKICAgIHByb21wdC5hcHBlbmRDaGlsZChwMSk7CiAgICBwMS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImhlbHAiKTsKCiAgICBpZiAodGhpcy5rZXlib2FyZGxlc3MpCiAgICAgIHAxLmlubmVySFRNTCA9ICJzd2lwZSBsZWZ0IHRvIG1vdmUgdG8gbmV4dCBzbGlkZSI7CiAgICBlbHNlCiAgICAgIHAxLmlubmVySFRNTCA9ICJTcGFjZSwgUmlnaHQgQXJyb3cgb3Igc3dpcGUgbGVmdCB0byBtb3ZlIHRvICIgKwogICAgICAgICAgICAgICAgICAgICAibmV4dCBzbGlkZSwgY2xpY2sgaGVscCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzIjsKCiAgICB0aGlzLmFkZF9saXN0ZW5lcihwcm9tcHQsICJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocHJvbXB0KTsKICAgICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICAKICAgICAgaWYgKGUuY2FuY2VsICE9IHVuZGVmaW5lZCkKICAgICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIAogICAgICBpZiAoZS5yZXR1cm5WYWx1ZSAhPSB1bmRlZmluZWQpCiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwcm9tcHQpOwogICAgdGhpcy5pbml0aWFsX3Byb21wdCA9IHByb21wdDsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwcm9tcHQpO30sIDUwMDApOwogIH0sCgogIGFkZF90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnRlciwgcGFnZTsKCiAgICAgdGhpcy50b29sYmFyID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICAgdGhpcy50b29sYmFyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAidG9vbGJhciIpOwoKICAgICAvLyBhIHJlYXNvbmFibHkgYmVoYXZlZCBicm93c2VyCiAgICAgaWYgKHRoaXMubnNfcG9zIHx8ICF0aGlzLmllNikKICAgICB7CiAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgICAgIHJpZ2h0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiZmxvYXQ6IHJpZ2h0OyB0ZXh0LWFsaWduOiByaWdodCIpOwoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIikKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGNvdW50ZXIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHJpZ2h0KTsKCiAgICAgICB2YXIgbGVmdCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImRpdiIpOwogICAgICAgbGVmdC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYWxpZ246IGxlZnQiKTsKCiAgICAgICAvLyBnbG9iYWwgZW5kIG9mIHNsaWRlIGluZGljYXRvcgogICAgICAgdGhpcy5lb3MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICB0aGlzLmVvcy5pbm5lckhUTUwgPSAiKiAiOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZCh0aGlzLmVvcyk7CgogICAgICAgdmFyIGhlbHAgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgICBoZWxwLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHRoaXMuaGVscF9wYWdlKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRoaXMubG9jYWxpemUodGhpcy5oZWxwX3RleHQpKTsKICAgICAgIGhlbHAuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiaGVscD8iKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoaGVscCk7CiAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyAKICAgICAgIHRoaXMuaGVscF9hbmNob3IgPSBoZWxwOyAgLy8gc2F2ZSBmb3IgZm9jdXMgaGFjawoKICAgICAgIHZhciBnYXAxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoZ2FwMSk7CgogICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiYSIpOwogICAgICAgY29udGVudHMuc2V0QXR0cmlidXRlKCJocmVmIiwgImphdmFzY3JpcHQ6dzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJDb250ZW50cyIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChnYXAyKTsKCiAgICAgICB2YXIgY29weXJpZ2h0ID0gdGhpcy5maW5kX2NvcHlyaWdodCgpOwoKICAgICAgIGlmIChjb3B5cmlnaHQpCiAgICAgICB7CiAgICAgICAgIHZhciBzcGFuID0gdGhpcy5jcmVhdGVfZWxlbWVudCgic3BhbiIpOwogICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICJjb3B5cmlnaHQiOwogICAgICAgICBzcGFuLmlubmVySFRNTCA9IGNvcHlyaWdodDsKICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgIH0KCiAgICAgICB0aGlzLnRvb2xiYXIuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQobGVmdCk7CiAgICAgfQogICAgIGVsc2UgLy8gSUU2IHNvIG5lZWQgdG8gd29yayBhcm91bmQgaXRzIHBvb3IgQ1NTIHN1cHBvcnQKICAgICB7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAodGhpcy5pZTcgPyAiZml4ZWQiIDogImFic29sdXRlIik7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUuekluZGV4ID0gIjIwMCI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUud2lkdGggPSAiOTkuOSUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmhlaWdodCA9ICIxLjJlbSI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUudG9wID0gImF1dG8iOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5sZWZ0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5mb250U2l6ZSA9ICI2MCUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmNvbG9yID0gInJlZCI7CiAgICAgICB0aGlzLnRvb2xiYXIuYm9yZGVyV2lkdGggPSAwOwogICAgICAgdGhpcy50b29sYmFyLmNsYXNzTmFtZSA9ICJ0b29sYmFyIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIC8vIHdvdWxkIGxpa2UgdG8gaGF2ZSBoZWxwIHRleHQgbGVmdCBhbGlnbmVkCiAgICAgICAvLyBhbmQgcGFnZSBjb3VudGVyIHJpZ2h0IGFsaWduZWQsIGZsb2F0aW5nCiAgICAgICAvLyBkaXYncyBkb24ndCB3b3JrLCBzbyBpbnN0ZWFkIHVzZSBuZXN0ZWQKICAgICAgIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZCBkaXYncy4KCiAgICAgICB2YXIgc3AgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICBzcC5pbm5lckhUTUwgPSAiJm5ic3A7Jm5ic3A7KiZuYnNwOyI7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQoc3ApOwogICAgICAgdGhpcy5lb3MgPSBzcDsgIC8vIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKCiAgICAgICB2YXIgaGVscCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJocmVmIiwgdGhpcy5oZWxwX3BhZ2UpOwogICAgICAgaGVscC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSh0aGlzLmhlbHBfdGV4dCkpOwogICAgICAgaGVscC5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJoZWxwPyIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGhlbHApOwogICAgICAgdGhpcy5oZWxwX2FuY2hvciA9IGhlbHA7ICAvLyBzYXZlIGZvciBmb2N1cyBoYWNrCgogICAgICAgdmFyIGdhcDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDEpOwoKICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGNvbnRlbnRzLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJqYXZhc2NyaXB0OnRvZ2dsZVRhYmxlT2ZDb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiLmxvY2FsaXplKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJjb250ZW50cz8iKTsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDIpOwoKICAgICAgIHZhciBjb3B5cmlnaHQgPSB0aGlzLmZpbmRfY29weXJpZ2h0KCk7CgogICAgICAgaWYgKGNvcHlyaWdodCkKICAgICAgIHsKICAgICAgICAgdmFyIHNwYW4gPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29weXJpZ2h0OwogICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gImJsYWNrIjsKICAgICAgICAgc3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjAuNWVtIjsKICAgICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHNwYW4pOwogICAgICAgfQoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKQogICAgICAgY291bnRlci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICBjb3VudGVyLnN0eWxlLndpZHRoID0gImF1dG8iOyAvLyIyMCUiOwogICAgICAgY291bnRlci5zdHlsZS5oZWlnaHQgPSAiMS4yZW0iOwogICAgICAgY291bnRlci5zdHlsZS50b3AgPSAiYXV0byI7CiAgICAgICBjb3VudGVyLnN0eWxlLmJvdHRvbSA9IDA7CiAgICAgICBjb3VudGVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgY291bnRlci5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOwogICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9ICJyZWQiOwogICAgICAgY291bnRlci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgICB9CgogICAgIC8vIGVuc3VyZSB0aGF0IGNsaWNrIGlzbid0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwYWdlCiAgICAgdGhpcy50b29sYmFyLm9uY2xpY2sgPQogICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKCiAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgZS5zcmNFbGVtZW50KQogICAgICAgICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBTYWZhcmkgYnVnCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiYSIpCiAgICAgICAgICAgICB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX2NsaWNrKGUpOwogICAgICAgICB9OwoKICAgICB0aGlzLnNsaWRlX251bWJlcl9lbGVtZW50ID0gY291bnRlcjsKICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKGZhbHNlKTsKICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhcik7CiAgfSwKCiAgLy8gd3lzaXd5ZyBlZGl0b3JzIG1ha2UgaXQgaGFyZCB0byB1c2UgZGl2IGVsZW1lbnRzCiAgLy8gZS5nLiBhbWF5YSBsb3NlcyB0aGUgZGl2IHdoZW4geW91IGNvcHkgYW5kIHBhc3RlCiAgLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBkaXYgZWxlbWVudHMgYXJvdW5kIGltcGxpY2l0CiAgLy8gc2xpZGVzIHdoaWNoIHN0YXJ0IHdpdGggYW4gaDEgZWxlbWVudCBhbmQgY29udGludWUKICAvLyB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9yIGRpdiBlbGVtZW50CiAgd3JhcF9pbXBsaWNpdF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBoZWFkaW5nLCBub2RlLCBuZXh0LCBkaXY7CiAgICB2YXIgaGVhZGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaDEiKTsKCiAgICBpZiAoIWhlYWRpbmdzKQogICAgICByZXR1cm47CgogICAgZm9yIChpID0gMDsgaSA8IGhlYWRpbmdzLmxlbmd0aDsgKytpKQogICAgewogICAgICBoZWFkaW5nID0gaGVhZGluZ3NbaV07CgogICAgICBpZiAoaGVhZGluZy5wYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkpCiAgICAgICAgY29udGludWU7CgogICAgICBub2RlID0gaGVhZGluZy5uZXh0U2libGluZzsKCiAgICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJzbGlkZSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VDaGlsZChkaXYsIGhlYWRpbmcpOwogICAgICBkaXYuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CgogICAgICB3aGlsZSAobm9kZSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIC8vIGFuIGVsZW1lbnQKICAgICAgICB7CiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkgxIiB8fCBub2RlLm5vZGVOYW1lID09ICJoMSIpCiAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkRJViIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiZGl2IikKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGhpcy5oYXNfY2xhc3Mobm9kZSwgInNsaWRlIikpCiAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhub2RlLCAiaGFuZG91dCIpKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICBub2RlID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgIH0gCiAgICB9CiAgfSwKCiAgYXR0YWNoX3RvdWNoX2hhbmRlcnM6IGZ1bmN0aW9uKHNsaWRlcykKICB7CiAgICB2YXIgaSwgc2xpZGU7CgogICAgZm9yIChpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgc2xpZGUgPSBzbGlkZXNbaV07CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2hzdGFydCIsIHRoaXMudG91Y2hzdGFydCk7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2htb3ZlIiwgdGhpcy50b3VjaG1vdmUpOwogICAgICB0aGlzLmFkZF9saXN0ZW5lcihzbGlkZSwgInRvdWNoZW5kIiwgdGhpcy50b3VjaGVuZCk7CiAgICB9CiAgfSwKCi8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIHNsaWRlcwogIGNvbGxlY3Rfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGVzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgInNsaWRlIikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgc2xpZGUgdG8gY29sbGVjdGlvbgogICAgICAgIHNsaWRlc1tzbGlkZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gaGlkZSBlYWNoIHNsaWRlIGFzIGl0IGlzIGZvdW5kCiAgICAgICAgdGhpcy5hZGRfY2xhc3MoZGl2LCAiaGlkZGVuIik7CgogICAgICAgIC8vIGFkZCBkdW1teSA8YnIvPiBhdCBlbmQgZm9yIHNjcm9sbGluZyBoYWNrCiAgICAgICAgdmFyIG5vZGUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZTEpOwogICAgICAgIHZhciBub2RlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIik7CiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUyKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJiYWNrZ3JvdW5kIikpCiAgICAgIHsgIC8vIHdvcmsgYXJvdW5kIGZvciBGaXJlZm94IFNWRyByZWxvYWQgYnVnCiAgICAgICAgLy8gd2hpY2ggb3RoZXJ3aXNlIHJlcGxhY2VzIDFzdCBTVkcgZ3JhcGhpYyB3aXRoIDJuZAogICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgfQogICAgfQoKICAgIHRoaXMuc2xpZGVzID0gc2xpZGVzOwogIH0sCgogIC8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIDxkaXYgY2xhc3M9ImhhbmRvdXQiPgogIGNvbGxlY3Rfbm90ZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBub3RlcyA9IG5ldyBBcnJheSgpOwogICAgdmFyIGRpdnMgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpdnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGRpdiA9IGRpdnMuaXRlbShpKTsKCiAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJoYW5kb3V0IikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgbm90ZSB0byBjb2xsZWN0aW9uCiAgICAgICAgbm90ZXNbbm90ZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gYW5kIGhpZGUgaXQKICAgICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJoaWRkZW4iKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMubm90ZXMgPSBub3RlczsKICB9LAoKICAvLyByZXR1cm4gbmV3IGFycmF5IG9mIGFsbCA8ZGl2IGNsYXNzPSJiYWNrZ3JvdW5kIj4KICAvLyBpbmNsdWRpbmcgbmFtZWQgYmFja2dyb3VuZHMgZS5nLiBjbGFzcz0iYmFja2dyb3VuZCB0aXRsZXBhZ2UiCiAgY29sbGVjdF9iYWNrZ3JvdW5kczogZnVuY3Rpb24gKCkgewogICAgdmFyIGJhY2tncm91bmRzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgImJhY2tncm91bmQiKSkKICAgICAgewogICAgICAgIC8vIGFkZCBiYWNrZ3JvdW5kIHRvIGNvbGxlY3Rpb24KICAgICAgICBiYWNrZ3JvdW5kc1tiYWNrZ3JvdW5kcy5sZW5ndGhdID0gZGl2OwoKICAgICAgICAvLyBhbmQgaGlkZSBpdAogICAgICAgIHRoaXMuYWRkX2NsYXNzKGRpdiwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CgogICAgdGhpcy5iYWNrZ3JvdW5kcyA9IGJhY2tncm91bmRzOwogIH0sCgogIC8vIHNldCBjbGljayBoYW5kbGVycyBvbiBhbGwgYW5jaG9ycwogIHBhdGNoX2FuY2hvcnM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdzNjX3NsaWR5OwogICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgLy8gY29tcGFyZSB0aGlzLmhyZWYgd2l0aCBsb2NhdGlvbi5ocmVmCiAgICAgIC8vIGZvciBsaW5rIHRvIGFub3RoZXIgc2xpZGUgaW4gdGhpcyBkb2MKCiAgICAgIGlmIChzZWxmLnBhZ2VfYWRkcmVzcyh0aGlzLmhyZWYpID09IHNlbGYucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpKQogICAgICB7CiAgICAgICAgLy8geWVzLCBzbyBmaW5kIG5ldyBzbGlkZSBudW1iZXIKICAgICAgICB2YXIgbmV3c2xpZGVudW0gPSBzZWxmLmZpbmRfc2xpZGVfbnVtYmVyKHRoaXMuaHJlZik7CgogICAgICAgIGlmIChuZXdzbGlkZW51bSAhPSBzZWxmLnNsaWRlX251bWJlcikKICAgICAgICB7CiAgICAgICAgICB2YXIgc2xpZGUgPSBzZWxmLnNsaWRlc1tzZWxmLnNsaWRlX251bWJlcl07CiAgICAgICAgICBzZWxmLmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICAgc2VsZi5zbGlkZV9udW1iZXIgPSBuZXdzbGlkZW51bTsKICAgICAgICAgIHNsaWRlID0gc2VsZi5zbGlkZXNbc2VsZi5zbGlkZV9udW1iZXJdOwogICAgICAgICAgc2VsZi5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAgIHNlbGYuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihldmVudCk7CgovLyAgICAgIGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi8vICAgICAgICBsb2NhdGlvbi5ocmVmID0gdGhpcy5ocmVmOwoKICAgICAgdGhpcy5ibHVyKCk7CiAgICAgIHNlbGYuZGlzYWJsZV9zbGlkZV9jbGljayA9IHRydWU7CiAgICB9OwoKICAgIHZhciBhbmNob3JzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKQogICAgICAgIGFuY2hvcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBoYW5kbGVyLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhbmNob3JzW2ldLmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgaGFuZGxlcik7CiAgICB9CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBzZWUgd2hpY2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkIHZpYSBzZXRUaW1lb3V0CiAgLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZm9yIHVzZSBvZiB3M2Nfc2xpZHkgdnMgdGhpcwogIHNob3dfc2xpZGVfbnVtYmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSB3M2Nfc2xpZHkuZ2V0X3RpbWVyKCk7CiAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyX2VsZW1lbnQuaW5uZXJIVE1MID0gdGltZXIgKyB3M2Nfc2xpZHkubG9jYWxpemUoInNsaWRlIikgKyAiICIgKwogICAgICAgICAgICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICsgMSkgKyAiLyIgKyB3M2Nfc2xpZHkuc2xpZGVzLmxlbmd0aDsKICB9LAoKICAvLyBldmVyeSAyMDBtUyBjaGVjayBpZiB0aGUgbG9jYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBhcyBhCiAgLy8gcmVzdWx0IG9mIHRoZSB1c2VyIGFjdGl2YXRpbmcgdGhlIEJhY2sgYnV0dG9uL21lbnUgaXRlbQogIC8vIGRvZXNuJ3Qgd29yayBmb3IgT3BlcmEgPCA5LjUKICBjaGVja19sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwoKICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID4gMCAmJiAoaGFzaCA9PSAiIiB8fCBoYXNoID09ICIjIikpCiAgICAgIHczY19zbGlkeS5nb3RvX3NsaWRlKDApOwogICAgZWxzZSBpZiAoaGFzaC5sZW5ndGggPiAyICYmIGhhc2ggIT0gIiMoIisodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSsiKSIpCiAgICB7CiAgICAgIHZhciBudW0gPSBwYXJzZUludChsb2NhdGlvbi5oYXNoLnN1YnN0cigyKSk7CgogICAgICBpZiAoIWlzTmFOKG51bSkpCiAgICAgICAgdzNjX3NsaWR5LmdvdG9fc2xpZGUobnVtLTEpOwogICAgfQoKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ICYmIHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgewogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ID4gMCkKICAgICAgICB3M2Nfc2xpZHkudGltZV9sZWZ0IC09IDIwMDsKICAgIH0gCiAgfSwKCiAgZ2V0X3RpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSAiIjsKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0KQogICAgewogICAgICB2YXIgbWlucywgc2VjczsKICAgICAgc2VjcyA9IE1hdGguZmxvb3IodzNjX3NsaWR5LnRpbWVfbGVmdC8xMDAwKTsKICAgICAgbWlucyA9IE1hdGguZmxvb3Ioc2VjcyAvIDYwKTsKICAgICAgc2VjcyA9IHNlY3MgJSA2MDsKICAgICAgdGltZXIgPSAobWlucyA/IG1pbnMrIm0iIDogIiIpICsgc2VjcyArICJzICI7CiAgICB9CgogICAgcmV0dXJuIHRpbWVyOwogIH0sCgogIC8vIHRoaXMgZG9lc24ndCBwdXNoIGxvY2F0aW9uIG9udG8gaGlzdG9yeSBzdGFjayBmb3IgSUUKICAvLyBmb3Igd2hpY2ggYSBoaWRkZW4gaWZyYW1lIGhhY2sgaXMgbmVlZGVkOiBsb2FkIHBhZ2UgaW50bwogIC8vIHRoZSBpZnJhbWUgd2l0aCBzY3JpcHQgdGhhdCBzZXQncyBwYXJlbnQncyBsb2NhdGlvbi5oYXNoCiAgLy8gYnV0IHRoYXQgd29uJ3Qgd29yayBmb3Igc3RhbmRhbG9uZSB1c2UgdW5sZXNzIHdlIGNhbgogIC8vIGNyZWF0ZSB0aGUgcGFnZSBkeW5hbWljYWxseSB2aWEgYSBqYXZhc2NyaXB0OiBVUkwKICAvLyAjIyMgdXNlIGhpc3RvcnkucHVzaFN0YXRlIGlmIGF2YWlsYWJsZQogIHNldF9sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgIHZhciB1cmkgPSB3M2Nfc2xpZHkucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpOwogICAgIHZhciBoYXNoID0gIiMoIiArICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyKzEpICsgIikiOwoKICAgICBpZiAodzNjX3NsaWR5LnNsaWRlX251bWJlciA+PSAwKQogICAgICAgdXJpID0gdXJpICsgaGFzaDsKCiAgICAgaWYgKHR5cGVvZihoaXN0b3J5LnB1c2hTdGF0ZSkgIT0gInVuZGVmaW5lZCIgJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIpCiAgICAgewogICAgICAgZG9jdW1lbnQudGl0bGUgPSB3M2Nfc2xpZHkudGl0bGUgKyAiICgiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CiAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSgwLCBkb2N1bWVudC50aXRsZSwgaGFzaCk7CiAgICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICAgIHczY19zbGlkeS5ub3RpZnlfb2JzZXJ2ZXJzKCk7CiAgICAgICByZXR1cm47CiAgICAgfQoKICAgICBpZiAodzNjX3NsaWR5LmllICYmICh3M2Nfc2xpZHkuaWU2IHx8IHczY19zbGlkeS5pZTcpKQogICAgICAgdzNjX3NsaWR5LnB1c2hfaGFzaChoYXNoKTsKCiAgICAgaWYgKHVyaSAhPSBsb2NhdGlvbi5ocmVmKSAvLyAmJiAha2h0bWwKICAgICAgICBsb2NhdGlvbi5ocmVmID0gdXJpOwoKICAgICBpZiAodGhpcy5raHRtbCkKICAgICAgICBoYXNoID0gIigiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CgogICAgIGlmICghdGhpcy5pZSAmJiBsb2NhdGlvbi5oYXNoICE9IGhhc2ggJiYgbG9jYXRpb24uaGFzaCAhPSAiIikKICAgICAgIGxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICB3M2Nfc2xpZHkubm90aWZ5X29ic2VydmVycygpOwogIH0sCgogIG5vdGlmeV9vYnNlcnZlcnM6IGZ1bmN0aW9uICgpCiAgewogICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbdGhpcy5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICAgIHRoaXMub2JzZXJ2ZXJzW2ldKHRoaXMuc2xpZGVfbnVtYmVyKzEsIHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKS5pbm5lclRleHQsIGxvY2F0aW9uLmhyZWYpOwogIH0sCgogIGFkZF9vYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyKQogIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChvYnNlcnZlciA9PSB0aGlzLm9ic2VydmVyc1tpXSkKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7CiAgfSwKCiAgcmVtb3ZlX29ic2VydmVyOiBmdW5jdGlvbiAobykKICB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDsgKytpKQogICAgewogICAgICBpZiAob2JzZXJ2ZXIgPT0gdGhpcy5vYnNlcnZlcnNbaV0pCiAgICAgIHsKICAgICAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaSwxKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCgogIHBhZ2VfYWRkcmVzczogZnVuY3Rpb24gKHVyaSkgewogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIGlmIChpIDwgMCkKICAgICAgaSA9IHVyaS5pbmRleE9mKCIlMjMiKTsKCiAgICAvLyBjaGVjayBpZiBhbmNob3IgaXMgZW50aXJlIHBhZ2UKCiAgICBpZiAoaSA8IDApCiAgICAgIHJldHVybiB1cmk7ICAvLyB5ZXMKCiAgICByZXR1cm4gdXJpLnN1YnN0cigwLCBpKTsKICB9LAoKICAvLyBvbmx5IHVzZWQgZm9yIElFNiBhbmQgSUU3CiAgb25fZnJhbWVfbG9hZGVkOiBmdW5jdGlvbiAoaGFzaCkgewogICAgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgICB2YXIgdXJpID0gdzNjX3NsaWR5LnBhZ2VfYWRkcmVzcyhsb2NhdGlvbi5ocmVmKTsKICAgIGxvY2F0aW9uLmhyZWYgPSB1cmkgKyBoYXNoOwogIH0sCgogIC8vIGhpc3RvcnkgaGFjayB3aXRoIHRoYW5rcyB0byBCZXJ0cmFuZCBMZSBSb3kKICBwdXNoX2hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CiAgICBpZiAoaGFzaCA9PSAiIikgaGFzaCA9ICIjKDEpIjsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgIHZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGlzdG9yeUZyYW1lIikuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgIGRvYy5vcGVuKCJqYXZhc2NyaXB0Oic8aHRtbD48L2h0bWw+JyIpOwogICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj53aW5kb3cucGFyZW50LnczY19zbGlkeS5vbl9mcmFtZV9sb2FkZWQoJyIrCiAgICAgIChoYXNoKSArICInKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+aGVsbG8gbXVtPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgZG9jLmNsb3NlKCk7CiAgfSwKCiAgLy8gZmluZCBjdXJyZW50IHNsaWRlIGJhc2VkIHVwb24gbG9jYXRpb24KICAvLyBmaXJzdCBmaW5kIHRhcmdldCBhbmNob3IgYW5kIHRoZW4gbG9vawogIC8vIGZvciBhc3NvY2lhdGVkIGRpdiBlbGVtZW50IGVuY2xvc2luZyBpdAogIC8vIGZpbmFsbHkgbWFwIHRoYXQgdG8gc2xpZGUgbnVtYmVyCiAgZmluZF9zbGlkZV9udW1iZXI6IGZ1bmN0aW9uICh1cmkpIHsKICAgIC8vIGZpcnN0IGdldCBhbmNob3IgZnJvbSBwYWdlIGxvY2F0aW9uCgogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIC8vIGNoZWNrIGlmIGFuY2hvciBpcyBlbnRpcmUgcGFnZQogICAgaWYgKGkgPCAwKQogICAgICByZXR1cm4gMDsgIC8vIHllcwoKICAgIHZhciBhbmNob3IgPSB1bmVzY2FwZSh1cmkuc3Vic3RyKGkrMSkpOwoKICAgIC8vIG5vdyB1c2UgYW5jaG9yIGFzIFhNTCBJRCB0byBmaW5kIHRhcmdldAogICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuY2hvcik7CgogICAgaWYgKCF0YXJnZXQpCiAgICB7CiAgICAgIC8vIGRvZXMgYW5jaG9yIGxvb2sgbGlrZSAiKDIpIiBmb3Igc2xpZGUgMiA/PwogICAgICAvLyB3aGVyZSBmaXJzdCBzbGlkZSBpcyAoMSkKICAgICAgdmFyIHJlID0gL1woKFxkKStcKS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgIHZhciBudW0gPSBwYXJzZUludChhbmNob3Iuc3Vic3RyaW5nKDEsIGFuY2hvci5sZW5ndGgtMSkpOwoKICAgICAgICBpZiAobnVtID4gdGhpcy5zbGlkZXMubGVuZ3RoKQogICAgICAgICAgbnVtID0gMTsKCiAgICAgICAgaWYgKC0tbnVtIDwgMCkKICAgICAgICAgIG51bSA9IDA7CgogICAgICAgIHJldHVybiBudW07CiAgICAgIH0KCiAgICAgIC8vIGFjY2VwdCBbMl0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgIHJlID0gL1xbKFxkKStcXS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgICB2YXIgbnVtID0gcGFyc2VJbnQoYW5jaG9yLnN1YnN0cmluZygxLCBhbmNob3IubGVuZ3RoLTEpKTsKCiAgICAgICAgIGlmIChudW0gPiB0aGlzLnNsaWRlcy5sZW5ndGgpCiAgICAgICAgICAgIG51bSA9IDE7CgogICAgICAgICBpZiAoLS1udW0gPCAwKQogICAgICAgICAgICBudW0gPSAwOwoKICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgfQoKICAgICAgLy8gb2ggZGVhciB1bmtub3duIGFuY2hvcgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBzZWFyY2ggZm9yIGVuY2xvc2luZyBzbGlkZQoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAvLyBicm93c2VyIGNvZXJjZXMgaHRtbCBlbGVtZW50cyB0byB1cHBlcmNhc2UhCiAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiZGl2IiAmJgogICAgICAgICAgICB0aGlzLmhhc19jbGFzcyh0YXJnZXQsICJzbGlkZSIpKQogICAgICB7CiAgICAgICAgLy8gZm91bmQgdGhlIHNsaWRlIGVsZW1lbnQKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgLy8gb3RoZXJ3aXNlIHRyeSBwYXJlbnQgZWxlbWVudCBpZiBhbnkKCiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgaWYgKCF0YXJnZXQpCiAgICAgIHsKICAgICAgICByZXR1cm4gMDsgICAvLyBubyBsdWNrIQogICAgICB9CiAgICB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChzbGlkZXNbaV0gPT0gdGFyZ2V0KQogICAgICAgIHJldHVybiBpOyAgLy8gc3VjY2VzcwogICAgfQoKICAgIC8vIG9oIGRlYXIgc3RpbGwgbm8gbHVjawogICAgcmV0dXJuIDA7CiAgfSwKCiAgcHJldmlvdXNfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZTsKCiAgICAgIGlmICgoaW5jcmVtZW50YWwgfHwgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9PSAwKSAmJiB3M2Nfc2xpZHkubGFzdF9zaG93biAhPSBudWxsKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkuaGlkZV9wcmV2aW91c19pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKCiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgLSAxOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICBpZiAoIXczY19zbGlkeS5uc19wb3MpCiAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgfQogIH0sCgogIG5leHRfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZSwgbGFzdCA9IHczY19zbGlkeS5sYXN0X3Nob3duOwoKICAgICAgaWYgKGluY3JlbWVudGFsIHx8IHczY19zbGlkeS5zbGlkZV9udW1iZXIgPT0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5yZXZlYWxfbmV4dF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKCiAgICAgIGlmICgoIWluY3JlbWVudGFsIHx8IHczY19zbGlkeS5sYXN0X3Nob3duID09IG51bGwpICYmCiAgICAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgKyAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlIGlmICghdzNjX3NsaWR5Lmxhc3Rfc2hvd24pCiAgICAgIHsKICAgICAgICAgaWYgKGxhc3QgJiYgaW5jcmVtZW50YWwpCiAgICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBsYXN0OwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgIH0KICB9LAoKICAvLyB0byBmaXJzdCBzbGlkZSB3aXRoIG5vdGhpbmcgcmV2ZWFsZWQKICAvLyBpLmUuIHN0YXRlIGF0IHN0YXJ0IG9mIHByZXNlbnRhdGlvbgogIGZpcnN0X3NsaWRlOiBmdW5jdGlvbiAoKSB7CiAgICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgewogICAgICAgdmFyIHNsaWRlOwoKICAgICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICE9IDApCiAgICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IDA7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgfQoKICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cygKICAgICAgICAgIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKICAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgICB9CiAgfSwKCiAgLy8gZ290byBsYXN0IHNsaWRlIHdpdGggZXZlcnl0aGluZyByZXZlYWxlZAogIC8vIGkuZS4gc3RhdGUgYXQgZW5kIG9mIHByZXNlbnRhdGlvbgogIGxhc3Rfc2xpZGU6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICB2YXIgc2xpZGU7CgogICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7IC8vcmV2ZWFsTmV4dEl0ZW0obGFzdFNob3duKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkubGFzdF9zaG93biA9PSBudWxsICYmCiAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKCiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgidmlzaWJsZSIpOwogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5wcmV2aW91c19pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgIH0KICB9LAoKCiAgLy8gIyMjIGNoZWNrIHRoaXMgYW5kIGNvbnNpZGVyIGFkZC9yZW1vdmUgY2xhc3MKICBzZXRfZW9zX3N0YXR1czogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICBpZiAodGhpcy5lb3MpCiAgICAgIHRoaXMuZW9zLnN0eWxlLmNvbG9yID0gKHN0YXRlID8gInJnYigyNDAsMjQwLDI0MCkiIDogInJlZCIpOwogIH0sCgogIC8vIGZpcnN0IHNsaWRlIGlzIDAKICBnb3RvX3NsaWRlOiBmdW5jdGlvbiAobnVtKSB7CiAgICAvL2FsZXJ0KCJnb2luZyB0byBzbGlkZSAiICsgKG51bSsxKSk7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IG51bTsKICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlX251bWJlcigpOwogIH0sCgoKICBzaG93X3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuc3luY19iYWNrZ3JvdW5kKHNsaWRlKTsKICAgIHRoaXMucmVtb3ZlX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CgogICAgLy8gd29yayBhcm91bmQgSUU5IG9iamVjdCByZW5kZXJpbmcgYnVnCiAgICBzZXRUaW1lb3V0KCJ3aW5kb3cuc2Nyb2xsVG8oMCwwKTsiLCAxKTsKICB9LAoKICBoaWRlX3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuYWRkX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CiAgfSwKCiAgc2V0X2ZvY3VzOiBmdW5jdGlvbiAoZWxlbWVudCkKICB7CiAgICBpZiAoZWxlbWVudCkKICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgZWxzZQogICAgewogICAgICB3M2Nfc2xpZHkuaGVscF9hbmNob3IuZm9jdXMoKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdzNjX3NsaWR5LmhlbHBfYW5jaG9yLmJsdXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfSwKCiAgLy8gc2hvdyBqdXN0IHRoZSBiYWNrZ3JvdW5kcyBwZXJ0aW5lbnQgdG8gdGhpcyBzbGlkZQogIC8vIHdoZW4gc2xpZGUgYmFja2dyb3VuZC1jb2xvciBpcyB0cmFuc3BhcmVudAogIC8vIHRoaXMgc2hvdWxkIG5vdyB3b3JrIHdpdGggcmdiYSBjb2xvciB2YWx1ZXMKICBzeW5jX2JhY2tncm91bmQ6IGZ1bmN0aW9uIChzbGlkZSkgewogICAgdmFyIGJhY2tncm91bmQ7CiAgICB2YXIgYmdDb2xvcjsKCiAgICBpZiAoc2xpZGUuY3VycmVudFN0eWxlKQogICAgICBiZ0NvbG9yID0gc2xpZGUuY3VycmVudFN0eWxlWyJiYWNrZ3JvdW5kQ29sb3IiXTsKICAgIGVsc2UgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3KQogICAgewogICAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShzbGlkZSxudWxsKTsKCiAgICAgIGlmIChzdHlsZXMpCiAgICAgICAgYmdDb2xvciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIik7CiAgICAgIGVsc2UgLy8gYnJva2VuIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IGR1ZSBTYWZhcmkgb3IgS29ucXVlcm9yCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJkZWZlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q29tcHV0ZWRTdHlsZSgpIik7CiAgICAgICAgYmdDb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgYmdDb2xvciA9PSAidHJhbnNwYXJlbnQiOwoKICAgIGlmIChiZ0NvbG9yID09ICJ0cmFuc3BhcmVudCIgfHwKICAgICAgICBiZ0NvbG9yLmluZGV4T2YoInJnYmEiKSA+PSAwIHx8CiAgICAgICAgYmdDb2xvci5pbmRleE9mKCJvcGFjaXR5IikgPj0gMCkKICAgIHsKICAgICAgdmFyIHNsaWRlQ2xhc3MgPSB0aGlzLmdldF9jbGFzc19saXN0KHNsaWRlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgICAgewogICAgICAgIGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRzW2ldOwoKICAgICAgICB2YXIgYmdDbGFzcyA9IHRoaXMuZ2V0X2NsYXNzX2xpc3QoYmFja2dyb3VuZCk7CgogICAgICAgIGlmICh0aGlzLm1hdGNoaW5nX2JhY2tncm91bmQoc2xpZGVDbGFzcywgYmdDbGFzcykpCiAgICAgICAgICB0aGlzLnJlbW92ZV9jbGFzcyhiYWNrZ3JvdW5kLCAiaGlkZGVuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5hZGRfY2xhc3MoYmFja2dyb3VuZCwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CiAgICBlbHNlIC8vIGZvcmNpYmx5IGhpZGUgYWxsIGJhY2tncm91bmRzCiAgICAgIHRoaXMuaGlkZV9iYWNrZ3JvdW5kcygpOwogIH0sCgogIGhpZGVfYmFja2dyb3VuZHM6IGZ1bmN0aW9uICgpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZHNbaV07CiAgICAgIHRoaXMuYWRkX2NsYXNzKGJhY2tncm91bmQsICJoaWRkZW4iKTsKICAgIH0KICB9LAoKICAvLyBjb21wYXJlIGNsYXNzZXMgZm9yIHNsaWRlIGFuZCBiYWNrZ3JvdW5kCiAgbWF0Y2hpbmdfYmFja2dyb3VuZDogZnVuY3Rpb24gKHNsaWRlQ2xhc3MsIGJnQ2xhc3MpIHsKICAgIHZhciBpLCBjb3VudCwgcGF0dGVybiwgcmVzdWx0OwoKICAgIC8vIGRlZmluZSBwYXR0ZXJuIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgcGF0dGVybiA9IC9cdysvZzsKCiAgICAvLyBjaGVjayBiYWNrZ3JvdW5kIGNsYXNzIG5hbWVzCiAgICByZXN1bHQgPSBiZ0NsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIGZvciAoaSA9IGNvdW50ID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgaWYgKHJlc3VsdFtpXSA9PSAiaGlkZGVuIikKICAgICAgICBjb250aW51ZTsKCiAgICAgIGlmIChyZXN1bHRbaV0gPT0gImJhY2tncm91bmQiKQoJY29udGludWU7CgogICAgICArK2NvdW50OwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSAgLy8gZGVmYXVsdCBtYXRjaAogICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcyBhbmQgcGxhY2UgcmVzdWx0IGluIGFycmF5CiAgICByZXN1bHQgPSBzbGlkZUNsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIG5hbWUgaXMgcHJlc2VudCBmb3IgYmFja2dyb3VuZAogICAgZm9yIChpID0gY291bnQgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQogICAgewogICAgICBpZiAocmVzdWx0W2ldID09ICJoaWRkZW4iKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgaWYgKHRoaXMuaGFzX3Rva2VuKGJnQ2xhc3MsIHJlc3VsdFtpXSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIHJlc2l6ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICB2YXIgd2lkdGggPSAwOwoKICAgICBpZiAoIHR5cGVvZiggd2luZG93LmlubmVyV2lkdGggKSA9PSAnbnVtYmVyJyApCiAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOyAgLy8gTm9uIElFIGJyb3dzZXIKICAgICBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKQogICAgICAgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7ICAvLyBJRTYKICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpCiAgICAgICB3aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7IC8vIElFNAoKICAgICB2YXIgaGVpZ2h0ID0gMDsKCiAgICAgaWYgKCB0eXBlb2YoIHdpbmRvdy5pbm5lckhlaWdodCApID09ICdudW1iZXInICkKICAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsgIC8vIE5vbiBJRSBicm93c2VyCiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgICAgICBoZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OyAgLy8gSUU2CiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKCiAgICAgaWYgKGhlaWdodCAmJiAod2lkdGgvaGVpZ2h0ID4gMS4wNSoxMDI0Lzc2OCkpCiAgICAgewogICAgICAgd2lkdGggPSBoZWlnaHQgKiAxMDI0LjAvNzY4OwogICAgIH0KCiAgICAgLy8gSUUgZmlyZXMgb25yZXNpemUgZXZlbiB3aGVuIG9ubHkgZm9udCBzaXplIGlzIGNoYW5nZWQhCiAgICAgLy8gc28gd2UgZG8gYSBjaGVjayB0byBhdm9pZCBibG9ja2luZyA8IGFuZCA+IGFjdGlvbnMKICAgICBpZiAod2lkdGggIT0gdzNjX3NsaWR5Lmxhc3Rfd2lkdGggfHwgaGVpZ2h0ICE9IHczY19zbGlkeS5sYXN0X2hlaWdodCkKICAgICB7CiAgICAgICBpZiAod2lkdGggPj0gMTEwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSA1OyAgICAvLyA0CiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSAxMDAwKQogICAgICAgICB3M2Nfc2xpZHkuc2l6ZV9pbmRleCA9IDQ7ICAgIC8vIDMKICAgICAgIGVsc2UgaWYgKHdpZHRoID49IDgwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSAzOyAgICAvLyAyCiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSA2MDApCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMjsgICAgLy8gMQogICAgICAgZWxzZSBpZiAod2lkdGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMDsKCiAgICAgICAvLyBhZGQgaW4gZm9udCBzaXplIGFkanVzdG1lbnQgZnJvbSBtZXRhIGVsZW1lbnQgZS5nLgogICAgICAgLy8gPG1ldGEgbmFtZT0iZm9udC1zaXplLWFkanVzdG1lbnQiIGNvbnRlbnQ9Ii0yIiAvPgogICAgICAgLy8gdXNlZnVsIHdoZW4gc2xpZGVzIGhhdmUgdG9vIG11Y2ggY29udGVudCA7LSkKCiAgICAgICBpZiAoMCA8PSB3M2Nfc2xpZHkuc2l6ZV9pbmRleCArIHczY19zbGlkeS5zaXplX2FkanVzdG1lbnQgJiYKICAgICAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ICsgdzNjX3NsaWR5LnNpemVfYWRqdXN0bWVudCA8IHczY19zbGlkeS5zaXplcy5sZW5ndGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gdzNjX3NsaWR5LnNpemVfaW5kZXggKyB3M2Nfc2xpZHkuc2l6ZV9hZGp1c3RtZW50OwoKICAgICAgIC8vIGVuYWJsZXMgY3Jvc3MgYnJvd3NlciB1c2Ugb2YgcmVsYXRpdmUgd2lkdGgvaGVpZ2h0CiAgICAgICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAgICAgIHczY19zbGlkeS5hZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CgogICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuZm9udFNpemUgIT0gdzNjX3NsaWR5LnNpemVzW3czY19zbGlkeS5zaXplX2luZGV4XSkKICAgICAgIHsKICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICAgICB9CgogICAgICAgdzNjX3NsaWR5Lmxhc3Rfd2lkdGggPSB3aWR0aDsKICAgICAgIHczY19zbGlkeS5sYXN0X2hlaWdodCA9IGhlaWdodDsKCiAgICAgICAvLyBmb3JjZSByZWZsb3cgdG8gd29yayBhcm91bmQgTW96aWxsYSBidWcKICAgICAgIGlmICh3M2Nfc2xpZHkubnNfcG9zKQogICAgICAgewogICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgIH0KCiAgICAgICAvLyBmb3JjZSBjb3JyZWN0IHBvc2l0aW9uaW5nIG9mIHRvb2xiYXIKICAgICAgIHczY19zbGlkeS5yZWZyZXNoX3Rvb2xiYXIoMjAwKTsKICAgICB9CiAgfSwKCiAgc2Nyb2xsZWQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkudG9vbGJhciAmJiAhdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhhY2tfb2Zmc2V0ID0gdzNjX3NsaWR5LnNjcm9sbF94X29mZnNldCgpOwogICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAgIC8vIG1ha2UgaXQgcmVhcHBlYXIgbGF0ZXIKICAgICAgaWYgKHczY19zbGlkeS5zY3JvbGxoYWNrID09IDAgJiYgIXczY19zbGlkeS52aWV3X2FsbCkKICAgICAgewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge3czY19zbGlkeS5zaG93X3Rvb2xiYXIoKTsgfSwgMTAwMCk7CiAgICAgICAgdzNjX3NsaWR5LnNjcm9sbGhhY2sgPSAxOwogICAgICB9CiAgICB9CiAgfSwKCiAgaGlkZV90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b29sYmFyLCAiaGlkZGVuIik7CiAgICB3aW5kb3cuZm9jdXMoKTsKICB9LAoKICAvLyB1c2VkIHRvIGVuc3VyZSBJRSByZWZyZXNoZXMgdG9vbGJhciBpbiBjb3JyZWN0IHBvc2l0aW9uCiAgcmVmcmVzaF90b29sYmFyOiBmdW5jdGlvbiAoaW50ZXJ2YWwpIHsKICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhpZGVfdG9vbGJhcigpOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHt3M2Nfc2xpZHkuc2hvd190b29sYmFyKCk7fSwgaW50ZXJ2YWwpOwogICAgfQogIH0sCgogIC8vIHJlc3RvcmVzIHRvb2xiYXIgYWZ0ZXIgc2hvcnQgZGVsYXkKICBzaG93X3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkud2FudF90b29sYmFyKQogICAgewogICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgewogICAgICAgIC8vIGFkanVzdCBwb3NpdGlvbiB0byBhbGxvdyBmb3Igc2Nyb2xsaW5nCiAgICAgICAgdmFyIHhvZmZzZXQgPSB3M2Nfc2xpZHkuc2Nyb2xsX3hfb2Zmc2V0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUubGVmdCA9IHhvZmZzZXQ7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUucmlnaHQgPSB4b2Zmc2V0OwoKICAgICAgICAvLyBkZXRlcm1pbmUgdmVydGljYWwgc2Nyb2xsIG9mZnNldAogICAgICAgIC8vdmFyIHlvZmZzZXQgPSBzY3JvbGxZT2Zmc2V0KCk7CgogICAgICAgIC8vIGJvdHRvbSBpcyBkb2MgaGVpZ2h0IC0gd2luZG93IGhlaWdodCAtIHNjcm9sbCBvZmZzZXQKICAgICAgICAvL3ZhciBib3R0b20gPSBkb2N1bWVudEhlaWdodCgpIC0gbGFzdEhlaWdodCAtIHlvZmZzZXQKCiAgICAgICAgLy9pZiAoeW9mZnNldCA+IDAgfHwgZG9jdW1lbnRIZWlnaHQoKSA+IGxhc3RIZWlnaHQpCiAgICAgICAgLy8gICBib3R0b20gKz0gMTY7ICAvLyBhbGxvdyBmb3IgaGVpZ2h0IG9mIHNjcm9sbGJhcgoKICAgICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5ib3R0b20gPSAwOyAvL2JvdHRvbTsKICAgICAgfQoKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpOwogICAgfQoKICAgIHczY19zbGlkeS5zY3JvbGxoYWNrID0gMDsKCgogICAgLy8gc2V0IHRoZSBrZXlib2FyZCBmb2N1cyB0byB0aGUgaGVscCBsaW5rIG9uIHRoZQogICAgLy8gdG9vbGJhciB0byBlbnN1cmUgdGhhdCBkb2N1bWVudCBoYXMgdGhlIGZvY3VzCiAgICAvLyBJRSBkb2Vzbid0IGFsd2F5cyB3b3JrIHdpdGggd2luZG93LmZvY3VzKCkKICAgIC8vIGFuZCB0aGlzIGhhY2sgaGFzIGJlbmVmaXQgb2YgRW50ZXIgZm9yIGhlbHAKCiAgICB0cnkKICAgIHsKICAgICAgaWYgKCF3M2Nfc2xpZHkub3BlcmEpCiAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICB9CiAgfSwKCi8vIGludm9rZWQgdmlhIEYga2V5CiAgdG9nZ2xlX3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDE7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDA7CiAgICAgIH0KICAgIH0KICB9LAoKICBzY3JvbGxfeF9vZmZzZXQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cucGFnZVhPZmZzZXQpCiAgICAgIHJldHVybiBzZWxmLnBhZ2VYT2Zmc2V0OwoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgCiAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0OwoKICAgIHJldHVybiAwOwogIH0sCgogIHNjcm9sbF95X29mZnNldDogZnVuY3Rpb24gKCkgewogICAgaWYgKHdpbmRvdy5wYWdlWU9mZnNldCkKICAgICAgcmV0dXJuIHNlbGYucGFnZVlPZmZzZXQ7CgogICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAKICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApCiAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgogICAgcmV0dXJuIDA7CiAgfSwKCiAgLy8gbG9va2luZyBmb3IgYSB3YXkgdG8gZGV0ZXJtaW5lIGhlaWdodCBvZiBzbGlkZSBjb250ZW50CiAgLy8gdGhlIHNsaWRlIGl0c2VsZiBpcyBzZXQgdG8gdGhlIGhlaWdodCBvZiB0aGUgd2luZG93CiAgb3B0aW1pemVfZm9udF9zaXplOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIC8vdmFyIGRoID0gZG9jdW1lbnRIZWlnaHQoKTsgLy9nZXREb2NIZWlnaHQoZG9jdW1lbnQpOwogICAgdmFyIGRoID0gc2xpZGUuc2Nyb2xsSGVpZ2h0OwogICAgdmFyIHdoID0gZ2V0V2luZG93SGVpZ2h0KCk7CiAgICB2YXIgdSA9IDEwMCAqIGRoIC8gd2g7CgogICAgYWxlcnQoIndpbmRvdyB1dGlsaXphdGlvbiA9ICIgKyB1ICsgIiUgKGRvYyAiCiAgICAgICsgZGggKyAiIHdpbiAiICsgd2ggKyAiKSIpOwogIH0sCgogIC8vIGZyb20gZG9jdW1lbnQgb2JqZWN0CiAgZ2V0X2RvY19oZWlnaHQ6IGZ1bmN0aW9uIChkb2MpIHsKICAgIGlmICghZG9jKQogICAgICBkb2MgPSBkb2N1bWVudDsKCiAgICBpZiAoZG9jICYmIGRvYy5ib2R5ICYmIGRvYy5ib2R5Lm9mZnNldEhlaWdodCkKICAgICAgcmV0dXJuIGRvYy5ib2R5Lm9mZnNldEhlaWdodDsgIC8vIG5zL2dlY2tvIHN5bnRheAoKICAgIGlmIChkb2MgJiYgZG9jLmJvZHkgJiYgZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0KQogICAgICByZXR1cm4gZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0OwoKICAgIGFsZXJ0KCJjb3VsZG4ndCBkZXRlcm1pbmUgZG9jdW1lbnQgaGVpZ2h0Iik7CiAgfSwKCiAgZ2V0X3dpbmRvd19oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICggdHlwZW9mKCB3aW5kb3cuaW5uZXJIZWlnaHQgKSA9PSAnbnVtYmVyJyApCiAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQ7ICAvLyBOb24gSUUgYnJvd3NlcgoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7ICAvLyBJRTYKCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKICB9LAoKICBkb2N1bWVudF9oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzaCwgb2g7CgogICAgc2ggPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgIG9oID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7CgogICAgaWYgKHNoICYmIG9oKQogICAgewogICAgICByZXR1cm4gKHNoID4gb2ggPyBzaCA6IG9oKTsKICAgIH0KCiAgICAvLyBubyBpZGVhIQogICAgcmV0dXJuIDA7CiAgfSwKCiAgc21hbGxlcjogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5zaXplX2luZGV4ID4gMCkKICAgIHsKICAgICAgLS13M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgYmlnZ2VyOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodzNjX3NsaWR5LnNpemVfaW5kZXggPCB3M2Nfc2xpZHkuc2l6ZXMubGVuZ3RoIC0gMSkKICAgIHsKICAgICAgKyt3M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgLy8gZW5hYmxlcyBjcm9zcyBicm93c2VyIHVzZSBvZiByZWxhdGl2ZSB3aWR0aC9oZWlnaHQKICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAvLyB3aXRoIHRoYW5rcyB0byBJdmFuIEhlcm1hbiBmb3IgdGhlIHN1Z2dlc3Rpb24KICBhZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnM6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICBmb3IoIHZhciBpID0gMDsgaSA8IHczY19zbGlkeS5vYmplY3RzLmxlbmd0aDsgaSsrICkKICAgIHsKICAgICAgdmFyIG9iaiA9IHRoaXMub2JqZWN0c1tpXTsKICAgICAgdmFyIG1pbWVUeXBlID0gb2JqLmdldEF0dHJpYnV0ZSgidHlwZSIpOwoKICAgICAgaWYgKG1pbWVUeXBlID09ICJpbWFnZS9zdmcreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQogICAgICB7CiAgICAgICAgaWYgKCAhb2JqLmluaXRpYWxXaWR0aCApIAogICAgICAgICAgb2JqLmluaXRpYWxXaWR0aCA9IG9iai5nZXRBdHRyaWJ1dGUoIndpZHRoIik7CgogICAgICAgIGlmICggIW9iai5pbml0aWFsSGVpZ2h0ICkgCiAgICAgICAgICBvYmouaW5pdGlhbEhlaWdodCA9IG9iai5nZXRBdHRyaWJ1dGUoImhlaWdodCIpOwoKICAgICAgICBpZiAoIG9iai5pbml0aWFsV2lkdGggJiYgb2JqLmluaXRpYWxXaWR0aC5jaGFyQXQob2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KG9iai5pbml0aWFsV2lkdGguc2xpY2UoMCwgb2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkpOwogICAgICAgICAgdmFyIG5ld1cgPSB3aWR0aCAqICh3LzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoIndpZHRoIixuZXdXKTsKICAgICAgICB9CgogICAgICAgIGlmICggb2JqLmluaXRpYWxIZWlnaHQgJiYKICAgICAgICAgICAgIG9iai5pbml0aWFsSGVpZ2h0LmNoYXJBdChvYmouaW5pdGlhbEhlaWdodC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KG9iai5pbml0aWFsSGVpZ2h0LnNsaWNlKDAsIG9iai5pbml0aWFsSGVpZ2h0Lmxlbmd0aC0xKSk7CiAgICAgICAgICB2YXIgbmV3SCA9IGhlaWdodCAqIChoLzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIG5ld0gpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIC8vIG5lZWRlZCBmb3IgT3BlcmEgdG8gaW5oaWJpdCBkZWZhdWx0IGJlaGF2aW9yCiAgLy8gc2luY2UgT3BlcmEgZGVsaXZlcnMga2V5UHJlc3MgZXZlbiBpZiBrZXlEb3duCiAgLy8gd2FzIGNhbmNlbGxlZAogIGtleV9wcmVzczogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoIWV2ZW50KQogICAgICBldmVudCA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoIXczY19zbGlkeS5rZXlfd2FudGVkKQogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gIFNlZSBlLmcuIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzL2tleXMuaHRtbCBmb3Iga2V5Y29kZXMKICBrZXlfZG93bjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIga2V5LCB0YXJnZXQsIHRhZzsKCiAgICB3M2Nfc2xpZHkua2V5X3dhbnRlZCA9IHRydWU7CgogICAgaWYgKCFldmVudCkKICAgICAgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICB7CiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgICB0YXJnZXQgPSB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudDsKICAgIH0KICAgIGVsc2UgaWYgKGV2ZW50LndoaWNoKQogICAgewogICAgICBrZXkgPSBldmVudC53aGljaDsKICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGF2b2lkIGludGVyZmVyaW5nIHdpdGgga2V5c3Ryb2tlCiAgICAvLyBiZWhhdmlvciBmb3Igbm9uLXNsaWR5IGNocm9tZSBlbGVtZW50cwogICAgaWYgKCF3M2Nfc2xpZHkuc2xpZHlfY2hyb21lKHRhcmdldCkgJiYKICAgICAgICB3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGNoZWNrIGZvciBjb25jdXJyZW50IGNvbnRyb2wvY29tbWFuZC9hbHQga2V5CiAgICAvLyBidXQgYXJlIHRoZXNlIG9ubHkgcHJlc2VudCBvbiBtb3VzZSBldmVudHM/CgogICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkpCiAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBkaXNtaXNzIHRhYmxlIG9mIGNvbnRlbnRzIGlmIHZpc2libGUKICAgIGlmICh3M2Nfc2xpZHkuaXNfc2hvd25fdG9jKCkgJiYga2V5ICE9IDkgJiYga2V5ICE9IDE2ICYmIGtleSAhPSAzOCAmJiBrZXkgIT0gNDApCiAgICB7CiAgICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKHRydWUpOwoKICAgICAgaWYgKGtleSA9PSAyNyB8fCBrZXkgPT0gODQgfHwga2V5ID09IDY3KQogICAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICBpZiAoa2V5ID09IDM0KSAvLyBQYWdlIERvd24KICAgIHsKICAgICAgaWYgKHczY19zbGlkeS52aWV3X2FsbCkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKGZhbHNlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDMzKSAvLyBQYWdlIFVwCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICB3M2Nfc2xpZHkucHJldmlvdXNfc2xpZGUoZmFsc2UpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzIpIC8vIHNwYWNlIGJhcgogICAgewogICAgICB3M2Nfc2xpZHkubmV4dF9zbGlkZSh0cnVlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDM3KSAvLyBMZWZ0IGFycm93CiAgICB7CiAgICAgIHczY19zbGlkeS5wcmV2aW91c19zbGlkZSghZXZlbnQuc2hpZnRLZXkpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzYpIC8vIEhvbWUKICAgIHsKICAgICAgdzNjX3NsaWR5LmZpcnN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzNSkgLy8gRW5kCiAgICB7CiAgICAgIHczY19zbGlkeS5sYXN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzOSkgLy8gUmlnaHQgYXJyb3cKICAgIHsKICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUoIWV2ZW50LnNoaWZ0S2V5KTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDEzKSAvLyBFbnRlcgogICAgewogICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUpCiAgICAgIHsKICAgICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUudmlzaWJsZSkKICAgICAgICAgIHczY19zbGlkeS5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICAgIAogICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg4KSAgLy8gPCBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTkwKSAgLy8gPiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDE4OSB8fCBrZXkgPT0gMTA5KSAgLy8gLSBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg3IHx8IGtleSA9PSAxOTEgfHwga2V5ID09IDEwNykgIC8vID0gKyAgZm9yIGxhcmdlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuYmlnZ2VyKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4MykgIC8vIFMgZm9yIHNtYWxsZXIgZm9udHMKICAgIHsKICAgICAgdzNjX3NsaWR5LnNtYWxsZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY2KSAgLy8gQiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDkwKSAgLy8gWiBmb3IgbGFzdCBzbGlkZQogICAgewogICAgICB3M2Nfc2xpZHkubGFzdF9zbGlkZSgpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gNzApICAvLyBGIGZvciB0b2dnbGUgdG9vbGJhcgogICAgewogICAgICB3M2Nfc2xpZHkudG9nZ2xlX3Rvb2xiYXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY1KSAgLy8gQSBmb3IgdG9nZ2xlIHZpZXcgc2luZ2xlL2FsbCBzbGlkZXMKICAgIHsKICAgICAgdzNjX3NsaWR5LnRvZ2dsZV92aWV3KCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3NSkgIC8vIHRvZ2dsZSBhY3Rpb24gb2YgbGVmdCBjbGljayBmb3IgbmV4dCBwYWdlCiAgICB7CiAgICAgIHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID0gIXczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkOwogICAgICB2YXIgYWxlcnRfbXNnID0gKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID8KICAgICAgICAgICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpICsgICIgbW91c2UgY2xpY2sgYWR2YW5jZSI7CgogICAgICBhbGVydCh3M2Nfc2xpZHkubG9jYWxpemUoYWxlcnRfbXNnKSk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4NCB8fCBrZXkgPT0gNjcpICAvLyBUIG9yIEMgZm9yIHRhYmxlIG9mIGNvbnRlbnRzCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudG9jKQogICAgICAgIHczY19zbGlkeS50b2dnbGVfdGFibGVfb2ZfY29udGVudHMoKTsKCiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3MikgLy8gSCBmb3IgaGVscAogICAgewogICAgICB3aW5kb3cubG9jYXRpb24gPSB3M2Nfc2xpZHkuaGVscF9wYWdlOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICAvL2Vsc2UgYWxlcnQoImtleSBjb2RlIGlzICIrIGtleSk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gc2FmZSBmb3IgYm90aCB0ZXh0L2h0bWwgYW5kIGFwcGxpY2F0aW9uL3hodG1sK3htbAogIGNyZWF0ZV9lbGVtZW50OiBmdW5jdGlvbiAobmFtZSkgewogICAgaWYgKHRoaXMueGh0bWwgJiYgKHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gJ3VuZGVmaW5lZCcpKQogICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgbmFtZSkKCiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICB9LAoKICBnZXRfZWxlbWVudF9zdHlsZTogZnVuY3Rpb24gKGVsZW0sIElFU3R5bGVQcm9wLCBDU1NTdHlsZVByb3ApIHsKICAgIGlmIChlbGVtLmN1cnJlbnRTdHlsZSkKICAgIHsKICAgICAgcmV0dXJuIGVsZW0uY3VycmVudFN0eWxlW0lFU3R5bGVQcm9wXTsKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKQogICAgewogICAgICB2YXIgY29tcFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgIiIpOwogICAgICByZXR1cm4gY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoQ1NTU3R5bGVQcm9wKTsKICAgIH0KICAgIHJldHVybiAiIjsKICB9LAoKICAvLyB0aGUgc3RyaW5nIHN0ciBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zCiAgLy8gdGVzdCBpZiBzdHIgY29udGFpbnMgYSBwYXJ0aWN1bGFyIHRva2VuLCBlLmcuICJzbGlkZSIKICBoYXNfdG9rZW46IGZ1bmN0aW9uIChzdHIsIHRva2VuKSB7CiAgICBpZiAoc3RyKQogICAgewogICAgICAvLyBkZWZpbmUgcGF0dGVybiBhcyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgdmFyIHBhdHRlcm4gPSAvXHcrL2c7CgogICAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcwogICAgICAvLyBwbGFjZSByZXN1bHQgaW4gYXJyYXkKICAgICAgdmFyIHJlc3VsdCA9IHN0ci5tYXRjaChwYXR0ZXJuKTsKCiAgICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIHRva2VuIGlzIHByZXNlbnQKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCiAgICAgIHsKICAgICAgICBpZiAocmVzdWx0W2ldID09IHRva2VuKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgZ2V0X2NsYXNzX2xpc3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gZWxlbWVudC5jbGFzc05hbWU7CgogICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogIH0sCgogIGhhc19jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgiKF58ICkiICsgbmFtZSArICJcVyoiKTsKCiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gcmVnZXhwLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwoKICAgIHJldHVybiByZWdleHAudGVzdChlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7CiAgfSwKCiAgcmVtb3ZlX2NsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoIihefCApIiArIG5hbWUgKyAiXFcqIik7CiAgICB2YXIgY2xzdmFsID0gIiI7CgogICAgaWYgKHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSAhPSAndW5kZWZpbmVkJykKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5jbGFzc05hbWU7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjbHN2YWw7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xzdmFsKTsKICAgICAgfQogICAgfQogIH0sCgogIGFkZF9jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmICghdGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgbmFtZSkpCiAgICB7CiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgIT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gIiAiICsgbmFtZTsKICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdmFyIGNsc3ZhbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogICAgICAgIGNsc3ZhbCA9IGNsc3ZhbCA/IGNsc3ZhbCArICIgIiArIG5hbWUgOiBuYW1lOwogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGNsc3ZhbCk7CiAgICAgIH0KICAgIH0KICB9LAoKICAvLyBIVE1MIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBjbGFzcz0iaW5jcmVtZW50YWwiCiAgLy8gbm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBwdXQgdGhlIGNsYXNzIG9uIGNvbnRhaW5lcnMgbGlrZQogIC8vIHVwLCBvbCwgZGwsIGFuZCBkaXYgdG8gbWFrZSB0aGVpciBjb250ZW50cyBhcHBlYXIKICAvLyBpbmNyZW1lbnRhbGx5LiBVcHBlciBjYXNlIGlzIHVzZWQgc2luY2UgdGhpcyBpcyB3aGF0CiAgLy8gYnJvd3NlcnMgcmVwb3J0IGZvciBIVE1MIG5vZGUgbmFtZXMgKHRleHQvaHRtbCkuCiAgaW5jcmVtZW50YWxfZWxlbWVudHM6IG51bGwsCiAgb2theV9mb3JfaW5jcmVtZW50YWw6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICBpZiAoIXRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMpCiAgICB7CiAgICAgIHZhciBpbmNsaXN0ID0gbmV3IEFycmF5KCk7CiAgICAgIGluY2xpc3RbInAiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInByZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsibGkiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImJsb2NrcXVvdGUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImR0Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJkZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImgzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJoNCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImg2Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJzcGFuIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJhZGRyZXNzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0YWJsZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsidHIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInRoIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0ZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaW1nIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJvYmplY3QiXSA9IHRydWU7CiAgICAgIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMgPSBpbmNsaXN0OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKICB9LAoKICBuZXh0X2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkubmV4dF9ub2RlKHNsaWRlLCBub2RlKTsKCiAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IG51bGwpCiAgICAgICAgYnJlYWs7CgogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSAgLy8gRUxFTUVOVAogICAgICB7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gYnIpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgImluY3JlbWVudGFsIikKICAgICAgICAgICAgICYmIHczY19zbGlkeS5va2F5X2Zvcl9pbmNyZW1lbnRhbChub2RlLm5vZGVOYW1lKSkKICAgICAgICAgIHJldHVybiBub2RlOwoKICAgICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLnBhcmVudE5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiAhdzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLCAibm9uLWluY3JlbWVudGFsIikpCiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0sCgogIHByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkucHJldmlvdXNfbm9kZShzbGlkZSwgbm9kZSk7CgogICAgICBpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZSA9PSBudWxsKQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IGJyKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmICh3M2Nfc2xpZHkuaGFzX2NsYXNzKG5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiB3M2Nfc2xpZHkub2theV9mb3JfaW5jcmVtZW50YWwobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgICByZXR1cm4gbm9kZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZS5wYXJlbnROb2RlLCAiaW5jcmVtZW50YWwiKQogICAgICAgICAgICAgJiYgIXczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgIm5vbi1pbmNyZW1lbnRhbCIpKQogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9LAoKICAvLyBzZXQgdmlzaWJpbGl0eSBmb3IgYWxsIGVsZW1lbnRzIG9uIGN1cnJlbnQgc2xpZGUgd2l0aAogIC8vIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGUgY2xhc3M9ImluY3JlbWVudGFsIgogIHNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMubmV4dF9pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwoKICAgIGlmICh2YWx1ZSA9PSAiaGlkZGVuIikKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogICAgZWxzZSAvLyB2YWx1ZSA9PSAidmlzaWJsZSIKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkucmVtb3ZlX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vIHJldmVhbCB0aGUgbmV4dCBoaWRkZW4gaXRlbSBvbiB0aGUgc2xpZGUKICAvLyBub2RlIGlzIG51bGwgb3IgdGhlIG5vZGUgdGhhdCB3YXMgbGFzdCByZXZlYWxlZAogIHJldmVhbF9uZXh0X2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKCiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiBub2RlOwogIH0sCgogIC8vIGV4YWN0IGludmVyc2Ugb2YgcmV2ZWFsTmV4dEl0ZW0obm9kZSkKICBoaWRlX3ByZXZpb3VzX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5hZGRfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obm9kZSk7CiAgfSwKCiAgLy8gbGVmdCB0byByaWdodCB0cmF2ZXJzYWwgb2Ygcm9vdCdzIGNvbnRlbnQKICBuZXh0X25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgICByZXR1cm4gcm9vdC5maXJzdENoaWxkOwoKICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpCiAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQ7CgogICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpCiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CgogICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PSByb290KQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9LAoKICAvLyByaWdodCB0byBsZWZ0IHRyYXZlcnNhbCBvZiByb290J3MgY29udGVudAogIHByZXZpb3VzX25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgewogICAgICBub2RlID0gcm9vdC5sYXN0Q2hpbGQ7CgogICAgICBpZiAobm9kZSkKICAgICAgewogICAgICAgIHdoaWxlIChub2RlLmxhc3RDaGlsZCkKICAgICAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDsKICAgICAgfQoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucHJldmlvdXNTaWJsaW5nKQogICAgewogICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpCiAgICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkOwoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSByb290KQogICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlOwoKICAgIHJldHVybiBudWxsOwogIH0sCgogIHByZXZpb3VzX3NpYmxpbmdfZWxlbWVudDogZnVuY3Rpb24gKGVsKSB7CiAgICBlbCA9IGVsLnByZXZpb3VzU2libGluZzsKCiAgICB3aGlsZSAoZWwgJiYgZWwubm9kZVR5cGUgIT0gMSkKICAgICAgZWwgPSBlbC5wcmV2aW91c1NpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIG5leHRfc2libGluZ19lbGVtZW50OiBmdW5jdGlvbiAoZWwpIHsKICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKGVsICYmIGVsLm5vZGVUeXBlICE9IDEpCiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIGZpcnN0X2NoaWxkX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbCkgewogICAgdmFyIG5vZGU7CgogICAgZm9yIChub2RlID0gZWwuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgZmlyc3RfdGFnOiBmdW5jdGlvbiAoZWxlbWVudCwgdGFnKSB7CiAgICB2YXIgbm9kZTsKCiAgICBpZiAoIXRoaXMuaXNfeGh0bWwpCiAgICAgIHRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpOwoKICAgIGZvciAobm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5ub2RlTmFtZSA9PSB0YWcpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgaGlkZV9zZWxlY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSAvLyBGaXJlZm94LCBDaHJvbWl1bSwgU2FmYXJpLCBPcGVyYQogICAgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwoKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkKICAgICAgewogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgIHJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgLy8gSW50ZXJuZXQgRXhwbG9yZXIKICAgIHsKICAgICAgdmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSAoKTsKICAgICAgdGV4dFJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICB9CiAgfSwKCiAgZ2V0X3NlbGVjdGVkX3RleHQ6IGZ1bmN0aW9uICgpIHsKICAgIHRyeQogICAgewogICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikKICAgICAgICByZXR1cm4gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CgogICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKQogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwoKICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikKICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgIH0KICAgIGNhdGNoIChlKQogICAgewogICAgfQoKICAgIHJldHVybiAiIjsKICB9LAoKICAvLyBtYWtlIG5vdGUgb2YgbGVuZ3RoIG9mIHNlbGVjdGVkIHRleHQKICAvLyBhcyB0aGlzIGV2YWx1YXRlcyB0byB6ZXJvIGluIGNsaWNrIGV2ZW50CiAgbW91c2VfYnV0dG9uX3VwOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogIH0sCgogIG1vdXNlX2J1dHRvbl9kb3duOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogICAgdzNjX3NsaWR5Lm1vdXNlX3ggPSBlLmNsaWVudFg7CiAgICB3M2Nfc2xpZHkubW91c2VfeSA9IGUuY2xpZW50WTsKICB9LAoKICAvLyByaWdodCBtb3VzZSBidXR0b24gY2xpY2sgaXMgcmVzZXJ2ZWQgZm9yIGNvbnRleHQgbWVudXMKICAvLyBpdCBpcyBtb3JlIHJlbGlhYmxlIHRvIGRldGVjdCByaWdodGNsaWNrIHRoYW4gbGVmdGNsaWNrCiAgbW91c2VfYnV0dG9uX2NsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFlKQogICAgICB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC13M2Nfc2xpZHkubW91c2VfeCkgKwogICAgICAgIE1hdGguYWJzKGUuY2xpZW50WSAtdzNjX3NsaWR5Lm1vdXNlX3kpID4gMTApCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPiAwKQogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgcmlnaHRjbGljayA9IGZhbHNlOwogICAgdmFyIGxlZnRjbGljayA9IGZhbHNlOwogICAgdmFyIG1pZGRsZWNsaWNrID0gZmFsc2U7CiAgICB2YXIgdGFyZ2V0OwoKICAgIGlmICghZSkKICAgICAgdmFyIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIC8vIHdvcmsgYXJvdW5kIFNhZmFyaSBidWcKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKGUud2hpY2gpIC8vIGFsbCBicm93c2VycyBleGNlcHQgSUUKICAgIHsKICAgICAgbGVmdGNsaWNrID0gKGUud2hpY2ggPT0gMSk7CiAgICAgIG1pZGRsZWNsaWNrID0gKGUud2hpY2ggPT0gMik7CiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS53aGljaCA9PSAzKTsKICAgIH0KICAgIGVsc2UgaWYgKGUuYnV0dG9uKQogICAgewogICAgICAvLyBLb25xdWVyb3IgZ2l2ZXMgMSBmb3IgbGVmdCwgNCBmb3IgbWlkZGxlCiAgICAgIC8vIElFNiBnaXZlcyAwIGZvciBsZWZ0IGFuZCBub3QgMSBhcyBJIGV4cGVjdGVkCgogICAgICBpZiAoZS5idXR0b24gPT0gNCkKICAgICAgICBtaWRkbGVjbGljayA9IHRydWU7CgogICAgICAvLyBhbGwgYnJvd3NlcnMgYWdyZWUgb24gMiBmb3IgcmlnaHQgYnV0dG9uCiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS5idXR0b24gPT0gMik7CiAgICB9CiAgICBlbHNlCiAgICAgIGxlZnRjbGljayA9IHRydWU7CgogICAgaWYgKHczY19zbGlkeS5zZWxlY3RlZF90ZXh0X2xlbiA+IDApCiAgICB7CiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGRpc21pc3MgdGFibGUgb2YgY29udGVudHMKICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKGZhbHNlKTsKCiAgICAvLyBjaGVjayBpZiB0YXJnZXQgaXMgc29tZXRoaW5nIHRoYXQgcHJvYmFibHkgd2FudCdzIGNsaWNrcwogICAgLy8gZS5nLiBhLCBlbWJlZCwgb2JqZWN0LCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uCiAgICB2YXIgdGFnID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkICYmIGxlZnRjbGljayAmJgogICAgICAgICF3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkgJiYKICAgICAgICAhdGFyZ2V0Lm9uY2xpY2spCiAgICB7CiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKHRydWUpOwogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgICAgZS5jYW5jZWwgPSB0cnVlOwogICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBzcGVjaWFsX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgIm5vbi1pbnRlcmFjdGl2ZSIpKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdmFyIHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gZWxlbWVudC5vbmtleWRvd24gfHwKICAgICAgZWxlbWVudC5vbmNsaWNrIHx8CiAgICAgIHRhZyA9PSAiYSIgfHwKICAgICAgdGFnID09ICJlbWJlZCIgfHwKICAgICAgdGFnID09ICJvYmplY3QiIHx8CiAgICAgIHRhZyA9PSAidmlkZW8iIHx8CiAgICAgIHRhZyA9PSAiYXVkaW8iIHx8CiAgICAgIHRhZyA9PSAic3ZnIiB8fAogICAgICB0YWcgPT0gImNhbnZhcyIgfHwKICAgICAgdGFnID09ICJpbnB1dCIgfHwKICAgICAgdGFnID09ICJ0ZXh0YXJlYSIgfHwKICAgICAgdGFnID09ICJzZWxlY3QiIHx8CiAgICAgIHRhZyA9PSAib3B0aW9uIjsKICB9LAoKICBzbGlkeV9jaHJvbWU6IGZ1bmN0aW9uIChlbCkgewogICAgd2hpbGUgKGVsKQogICAgewogICAgICBpZiAoZWwgPT0gdzNjX3NsaWR5LnRvYyB8fAogICAgICAgICAgZWwgPT0gdzNjX3NsaWR5LnRvb2xiYXIgfHwKICAgICAgICAgIHczY19zbGlkeS5oYXNfY2xhc3MoZWwsICJvdXRsaW5lIikpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGdldF9rZXk6IGZ1bmN0aW9uIChlKQogIHsKICAgIHZhciBrZXk7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKICAgIGVsc2UgaWYgKGUud2hpY2gpCiAgICAgIGtleSA9IGUud2hpY2g7CgogICAgcmV0dXJuIGtleTsKICB9LAoKICBnZXRfdGFyZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgdmFyIHRhcmdldDsKCiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgIT0gMSkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgcmV0dXJuIHRhcmdldDsKICB9LAoKICAvLyBkb2VzIGRpc3BsYXkgcHJvcGVydHkgcHJvdmlkZSBjb3JyZWN0IGRlZmF1bHRzPwogIGlzX2Jsb2NrOiBmdW5jdGlvbiAoZWxlbSkgewogICAgdmFyIHRhZyA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gdGFnID09ICJvbCIgfHwgdGFnID09ICJ1bCIgfHwgdGFnID09ICJwIiB8fCB0YWcgPT0gImRsIiB8fAogICAgICAgICAgIHRhZyA9PSAibGkiIHx8IHRhZyA9PSAidGFibGUiIHx8IHRhZyA9PSAicHJlIiB8fAogICAgICAgICAgIHRhZyA9PSAiaDEiIHx8IHRhZyA9PSAiaDIiIHx8IHRhZyA9PSAiaDMiIHx8CiAgICAgICAgICAgdGFnID09ICJoNCIgfHwgdGFnID09ICJoNSIgfHwgdGFnID09ICJoNiIgfHwKICAgICAgICAgICB0YWcgPT0gImJsb2NrcXVvdGUiIHx8IHRhZyA9PSAiYWRkcmVzcyI7IAogIH0sCgogIGFkZF9saXN0ZW5lcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7CiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpOwogICAgZWxzZQogICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIrZXZlbnQsIGhhbmRsZXIpOwogIH0sCgogIC8vIHVzZWQgdG8gcHJldmVudCBldmVudCBwcm9wYWdhdGlvbiBmcm9tIGZpZWxkIGNvbnRyb2xzCiAgc3RvcF9wcm9wYWdhdGlvbjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudCA9IGV2ZW50ID8gZXZlbnQgOiB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOyAgLy8gZm9yIElFCgogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgY2FuY2VsOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGlmIChldmVudCkKICAgIHsKICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7CiAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoKICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgogICAgdzNjX3NsaWR5LmtleV93YW50ZWQgPSBmYWxzZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAoKLy8gZm9yIGVhY2ggbGFuZ3VhZ2UgZGVmaW5lIGFuIGFzc29jaWF0aXZlIGFycmF5Ci8vIGFuZCBhbHNvIHRoZSBoZWxwIHRleHQgd2hpY2ggaXMgbG9uZ2VyCgogIHN0cmluZ3NfZXM6IHsKICAgICJzbGlkZSI6InDDoWcuIiwKICAgICJoZWxwPyI6IkF5dWRhIiwKICAgICJjb250ZW50cz8iOiLDjW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6InRhYmxhIGRlIGNvbnRlbmlkb3MiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiVGFibGEgZGUgQ29udGVuaWRvcyIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZWluaWNpYXIgcHJlc2VudGFjacOzbiIsCiAgICAicmVzdGFydD8iOiJJbmljaW8iCiAgfSwKICBoZWxwX2VzOgogICAgIlV0aWxpY2UgZWwgcmF0w7NuLCBiYXJyYSBlc3BhY2lhZG9yYSwgdGVjbGFzIEl6ZGEvRGNoYSwgIiArCiAgICAibyBSZSBww6FnIHkgQXYgcMOhZy4gVXNlIFMgeSBCIHBhcmEgY2FtYmlhciBlbCB0YW1hw7FvIGRlIGZ1ZW50ZS4iLAoKICBzdHJpbmdzX2NhOiB7CiAgICAic2xpZGUiOiJww6BnLi4iLAogICAgImhlbHA/IjoiQWp1ZGEiLAogICAgImNvbnRlbnRzPyI6IsONbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YXVsYSBkZSBjb250aW5ndXRzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhdWxhIGRlIENvbnRpbmd1dHMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVpbmljaWFyIHByZXNlbnRhY2nDsyIsCiAgICAicmVzdGFydD8iOiJJbmljaSIKICB9LAogIGhlbHBfY2E6CiAgICAiVXRpbGl0emkgZWwgcmF0b2zDrSwgYmFycmEgZXNwYWlhZG9yYSwgdGVjbGVzIEVzcS4vRHRhLiAiICsKICAgICJvIFJlIHDDoGcgeSBBdiBww6BnLiBVc2kgUyBpIEIgcGVyIGNhbnZpYXIgZ3JhbmTDoHJpYSBkZSBmb250LiIsCgogIHN0cmluZ3NfY3M6IHsKICAgICJzbGlkZSI6InNuw61tZWsiLAogICAgImhlbHA/IjoibsOhcG92xJtkYSIsCiAgICAiY29udGVudHM/Ijoib2JzYWgiLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoib2JzYWggcHJlemVudGFjZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJPYnNhaCBwcmV6ZW50YWNlIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6Inpub3Z1IHNwdXN0aXQgcHJlemVudGFjaSIsCiAgICAicmVzdGFydD8iOiJyZXN0YXJ0IgogIH0sCiAgaGVscF9jczoKICAgICJQcmV6ZW50YWNpIG3Fr8W+ZXRlIHByb2Now6F6ZXQgcG9tb2PDrSBrbGlrbnV0w60gbXnFoWksIG1lemVybsOta3UsICIgKwogICAgIsWhaXBlayB2bGV2byBhIHZwcmF2byBuZWJvIGtsw6F2ZXMgUGFnZVVwIGEgUGFnZURvd24uIFDDrXNtbyBzZSAiICsKICAgICJkw6EgenbEm3TFoWl0IGEgem1lbsWhaXQgcG9tb2PDrSBrbMOhdmVzIEIgYSBTLiIsCgogIHN0cmluZ3Nfbmw6IHsKICAgICJzbGlkZSI6InBhZ2luYSIsCiAgICAiaGVscD8iOiJIZWxwPyIsCiAgICAiY29udGVudHM/IjoiSW5ob3VkPyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbmhvdWRzb3BnYXZlIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IkluaG91ZHNvcGdhdmUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiaGVyc3RhcnQgcHJlc2VudGF0aWUiLAogICAgInJlc3RhcnQ/IjoiSGVyc3RhcnQ/IgogIH0sCiAgaGVscF9ubDoKICAgICAiTmF2aWdlZXIgZC5tLnYuIGhldCBtdWlzLCBzcGF0aWViYXIsIExpbmtzL1JlY2h0cyB0b2V0c2VuLCAiICsKICAgICAib2YgUGdVcCBlbiBQZ0RuLiBHZWJydWlrIFMgZW4gQiBvbSBkZSBrYXJha3Rlcmdyb290dGUgdGUgdmVyYW5kZXJlbi4iLAoKICBzdHJpbmdzX2RlOiB7CiAgICAic2xpZGUiOiJTZWl0ZSIsCiAgICAiaGVscD8iOiJIaWxmZSIsCiAgICAiY29udGVudHM/Ijoiw5xiZXJzaWNodCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJJbmhhbHRzdmVyemVpY2huaXMiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiSW5oYWx0c3ZlcnplaWNobmlzIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IlByw6RzZW50YXRpb24gbmV1IHN0YXJ0ZW4iLAogICAgInJlc3RhcnQ/IjoiTmV1c3RhcnQiCiAgfSwKICBoZWxwX2RlOgogICAgIkJlbnV0emVuIFNpZSBkaWUgTWF1cywgTGVlcnNjaGxhZywgZGllIEN1cnNvcnRhc3RlbiBsaW5rcy9yZWNodHMgb2RlciAiICsKICAgICJQYWdlIHVwL1BhZ2UgRG93biB6dW0gV2VjaHNlbG4gZGVyIFNlaXRlbiB1bmQgUyB1bmQgQiBmw7xyIGRpZSBTY2hyaWZ0Z3LDtnNzZS4iLAoKICBzdHJpbmdzX3BsOiB7CiAgICAic2xpZGUiOiJzbGFqZCIsCiAgICAiaGVscD8iOiJwb21vYz8iLAogICAgImNvbnRlbnRzPyI6InNwaXMgdHJlxZtjaT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoic3BpcyB0cmXFm2NpIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlNwaXMgVHJlxZtjaSIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZXN0YXJ0dWogcHJlemVudGFjasSZIiwKICAgICJyZXN0YXJ0PyI6InJlc3RhcnQ/IgogIH0sCiAgaGVscF9wbDoKICAgICJabWllbmlhaiBzbGFqZHkga2xpa2FqxIVjIG15c3rEhSwgbmFjaXNrYWrEhWMgc3BhY2rEmSwgc3RyemHFgmtpIGxld28vcHJhd28iICsKICAgICJsdWIgUGdVcCAvIFBnRG4uIFXFvHlqIGtsYXdpc3p5IFMgaSBCLCBhYnkgem1pZW5pxIcgcm96bWlhciBjemN6aW9ua2kuIiwKCiAgc3RyaW5nc19mcjogewogICAgInNsaWRlIjoicGFnZSIsCiAgICAiaGVscD8iOiJBaWRlIiwKICAgICJjb250ZW50cz8iOiJJbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YWJsZSBkZXMgbWF0acOocmVzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhYmxlIGRlcyBtYXRpw6hyZXMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVjb21tZW5jZXIgbCdleHBvc8OpIiwKICAgICJyZXN0YXJ0PyI6IkTDqWJ1dCIKICB9LAogIGhlbHBfZnI6CiAgICAiTmF2aWd1ZXogYXZlYyBsYSBzb3VyaXMsIGxhIGJhcnJlIGQnZXNwYWNlLCBsZXMgZmzDqGNoZXMgIiArCiAgICAiZ2F1Y2hlL2Ryb2l0ZSBvdSBsZXMgdG91Y2hlcyBQZyBVcCwgUGcgRG4uIFV0aWxpc2V6ICIgKwogICAgImxlcyB0b3VjaGVzIFMgZXQgQiBwb3VyIG1vZGlmaWVyIGxhIHRhaWxsZSBkZSBsYSBwb2xpY2UuIiwKCiAgc3RyaW5nc19odTogewogICAgInNsaWRlIjoib2xkYWwiLAogICAgImhlbHA/Ijoic2Vnw610c8OpZyIsCiAgICAiY29udGVudHM/IjoidGFydGFsb20iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoidGFydGFsb21qZWd5esOpayIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJUYXJ0YWxvbWplZ3l6w6lrIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6ImJlbXV0YXTDsyDDumpyYWluZMOtdMOhc2EiLAogICAgInJlc3RhcnQ/Ijoiw7pqcmFpbmTDrXTDoXMiCiAgfSwKICBoZWxwX2h1OgogICAgIkF6IG9sZGFsYWsga8O2enRpIGzDqXBrZWTDqXNoZXoga2F0dGludHNvbiBheiBlZ8OpcnJlbCwgdmFneSAiICsKICAgICJoYXN6bsOhbGphIGEgc3rDs2vDtnosIGEgYmFsLCB2YWd5IGEgam9iYiBuecOtbCwgaWxsZXR2ZSBhIFBhZ2UgRG93biwgIiArCiAgICAiUGFnZSBVcCBiaWxsZW50ecWxa2V0LiBBeiBTIMOpcyBhIEIgYmlsbGVudHnFsWtrZWwgdsOhbHRvenRhdGhhdGphICIgKwogICAgImEgc3rDtnZlZyBtw6lyZXTDqXQuIiwKCiAgc3RyaW5nc19pdDogewogICAgInNsaWRlIjoicGFnLiIsCiAgICAiaGVscD8iOiJBaXV0byIsCiAgICAiY29udGVudHM/IjoiSW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6ImluZGljZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJJbmRpY2UiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmljb21pbmNpYXJlIGxhIHByZXNlbnRhemlvbmUiLAogICAgInJlc3RhcnQ/IjoiSW5pemlvIgogIH0sCiAgaGVscF9pdDoKICAgICJOYXZpZ2FyZSBjb24gbW91c2UsIGJhcnJhIHNwYXppbywgZnJlY2NlIHNpbmlzdHJhL2Rlc3RyYSBvICIgKwogICAgIlBnVXAgZSBQZ0RuLiBVc2FyZSBTIGUgQiBwZXIgY2FtYmlhcmUgbGEgZGltZW5zaW9uZSBkZWkgY2FyYXR0ZXJpLiIsCgogIHN0cmluZ3NfZWw6IHsKICAgICJzbGlkZSI6Is+DzrXOu86vzrTOsSIsCiAgICAiaGVscD8iOiLOss6/zq7OuM61zrnOsTsiLAogICAgImNvbnRlbnRzPyI6Is+AzrXPgc65zrXPh8+MzrzOtc69zrE7IiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6Is+Azq/Ovc6xzrrOsc+CIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiLOoM6vzr3Osc66zrHPgiDOoM61z4HOuc61z4fOv868zq3Ovc+Jzr0iLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoizrXPgM6xzr3Otc66zrrOr869zrfPg863IM+AzrHPgc6/z4XPg86vzrHPg863z4IiLAogICAgInJlc3RhcnQ/IjoizrXPgM6xzr3Otc66zrrOr869zrfPg863OyIKICB9LAogIGhlbHBfZWw6CiAgICAizqDOu86/zrfOs863zrjOtc6vz4TOtSDOvM61IM+Ezr8gzrrOu86vzrogz4TOv8+FIM+Azr/Ovc+EzrnOus65zr/PjSwgz4TOvyBzcGFjZSwgz4TOsSDOss6tzrvOtyDOsc+BzrnPg8+EzrXPgc6sL860zrXOvs65zqwsICIgKwogICAgIs6uIFBhZ2UgVXAgzrrOsc65IFBhZ2UgRG93bi4gzqfPgc63z4POuc68zr/PgM6/zrnOrs+Dz4TOtSDPhM6xIM+AzrvOrs66z4TPgc6xIFMgzrrOsc65IEIgzrPOuc6xIM69zrEgzrHOu867zqzOvs61z4TOtSAiICsKICAgICLPhM6/IM68zq3Os861zrjOv8+CIM+EzrfPgiDOs8+BzrHOvM68zrHPhM6/z4POtc65z4HOrM+CLiIsCgogIHN0cmluZ3NfamE6IHsKICAgICJzbGlkZSI6IuOCueODqeOCpOODiSIsCiAgICAiaGVscD8iOiLjg5jjg6vjg5ciLAogICAgImNvbnRlbnRzPyI6IuebruasoSIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67mrKHjgpLooajnpLoiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5qyhIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IuacgOWIneOBi+OCieWGjeeUnyIsCiAgICAicmVzdGFydD8iOiLmnIDliJ3jgYvjgokiCiAgfSwKICBoZWxwX2phOgogICAgICLjg57jgqbjgrnlt6bjgq/jg6rjg4Pjgq8g44O7IOOCueODmuODvOOCuSDjg7sg5bem5Y+z44Kt44O8ICIgKwogICAgICLjgb7jgZ/jga8gUGFnZSBVcCDjg7sgUGFnZSBEb3du44Gn5pON5L2c77yMIFMg44O7IELjgafjg5Xjgqnjg7Pjg4jjgrXjgqTjgrrlpInmm7QiLAoKICBzdHJpbmdzX3poOiB7CiAgICAic2xpZGUiOiLlubvnga/niYciLAogICAgImhlbHA/Ijoi5biu5YqpPyIsCiAgICAiY29udGVudHM/Ijoi5YaF5a65PyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67lvZUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5b2VIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IumHjeaWsOWQr+WKqOWxleekuiIsCiAgICAicmVzdGFydD8iOiLph43mlrDlkK/liqg/IgogIH0sCiAgaGVscF96aDoKICAgICLnlKjpvKDmoIfngrnlh7ssIOepuuagvOadoSwg5bem5Y+z566t5aS0LCBQZyBVcCDlkowgUGcgRG4g5a+86IiqLiAiICsKICAgICLnlKggUywgQiDmlLnlj5jlrZfkvZPlpKflsI8uIiwKCiAgc3RyaW5nc19ydTogewogICAgInNsaWRlIjoi0YHQu9Cw0LnQtCIsCiAgICAiaGVscD8iOiLQv9C+0LzQvtGJ0Yw/IiwKICAgICJjb250ZW50cz8iOiLRgdC+0LTQtdGA0LbQsNC90LjQtT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoi0L7Qs9C70LDQstC70LXQvdC40LUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi0J7Qs9C70LDQstC70LXQvdC40LUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoi0L/QtdGA0LXQt9Cw0L/Rg9GB0YLQuNGC0Ywg0L/RgNC10LfQtdC90YLQsNGG0LjRjiIsCiAgICAicmVzdGFydD8iOiLQv9C10YDQtdC30LDQv9GD0YHQuj8iCiAgfSwKICBoZWxwX3J1OgogICAgItCf0LXRgNC10LzQtdGJ0LDQudGC0LXRgdGMINC60LvQuNC60LDRjyDQvNGL0YjQutC+0LksINC40YHQv9C+0LvRjNC30YPRjyDQutC70LDQstC40YjRgyDQv9GA0L7QsdC10LssINGB0YLRgNC10LvQutC4IiArCiAgICAi0LLQu9C10LLQvi/QstC/0YDQsNCy0L4g0LjQu9C4IFBnIFVwINC4IFBnIERuLiDQmtC70LDQstC40YjQuCBTINC4IEIg0LzQtdC90Y/RjtGCINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAuIiwKCiAgc3RyaW5nc19zdjogewogICAgInNsaWRlIjoic2lkYSIsCiAgICAiaGVscD8iOiJoasOkbHAiLAogICAgImNvbnRlbnRzPyI6ImlubmVow6VsbCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbm5laMOlbGxzZsO2cnRlY2tuaW5nIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IklubmVow6VsbHNmw7ZydGVja25pbmciLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoidmlzYSBwcmVzZW50YXRpb25lbiBmcsOlbiBiw7ZyamFuIiwKICAgICJyZXN0YXJ0PyI6ImLDtnJqYSBvbSIKICB9LAogIGhlbHBfc3Y6CiAgICAiQmzDpGRkcmEgbWVkIGV0dCBrbGljayBtZWQgdsOkbnN0cmEgbXVza25hcHBlbiwgbWVsbGFuc2xhZ3N0YW5nZW50ZW4sICIgKwogICAgInbDpG5zdGVyLSBvY2ggaMO2Z2VycGlsdGFuZ2VudGVybmEgZWxsZXIgdGFuZ2VudGVybmEgUGcgVXAsIFBnIERuLiAiICsKICAgICJBbnbDpG5kIHRhbmdlbnRlcm5hIFMgb2NoIEIgZsO2ciBhdHQgw6RuZHJhIHRleHRlbnMgc3Rvcmxlay4iLAoKICBzdHJpbmdzOiB7IH0sCgogIGxvY2FsaXplOiBmdW5jdGlvbiAoc3JjKSB7CiAgICBpZiAoc3JjID09ICIiKQogICAgICByZXR1cm4gc3JjOwoKICAgICAvLyB0cnkgZnVsbCBsYW5ndWFnZSBjb2RlLCBlLmcuIGVuLVVTCiAgICAgdmFyIHMsIGxvb2t1cCA9IHczY19zbGlkeS5zdHJpbmdzW3czY19zbGlkeS5sYW5nXTsKCiAgICAgaWYgKGxvb2t1cCkKICAgICB7CiAgICAgICBzID0gbG9va3VwW3NyY107CgogICAgICAgaWYgKHMpCiAgICAgICAgcmV0dXJuIHM7CiAgICAgfQoKICAgICAvLyBzdHJpcCBjb3VudHJ5IGNvZGUgc3VmZml4LCBlLmcuCiAgICAgLy8gdHJ5IGVuIGlmIHVuZGVmaW5lZCBmb3IgZW4tVVMKICAgICB2YXIgbGcgPSB3M2Nfc2xpZHkubGFuZy5zcGxpdCgiLSIpOwoKICAgICBpZiAobGcubGVuZ3RoID4gMSkKICAgICB7CiAgICAgICBsb29rdXAgPSB3M2Nfc2xpZHkuc3RyaW5nc1tsZ1swXV07CgogICAgICAgaWYgKGxvb2t1cCkKICAgICAgIHsKICAgICAgICAgcyA9IGxvb2t1cFtzcmNdOwoKICAgICAgICAgaWYgKHMpCiAgICAgICAgICByZXR1cm4gczsKICAgICAgIH0KICAgICB9CgogICAgIC8vIG90aGVyd2lzZSBzdHJpbmcgYXMgaXMKICAgICByZXR1cm4gc3JjOwogIH0sCgogIGluaXRfbG9jYWxpemF0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaTE4biA9IHczY19zbGlkeTsKICAgIHZhciBoZWxwX3RleHQgPSB3M2Nfc2xpZHkuaGVscF90ZXh0OwoKICAgIC8vIGVhY2ggc3VjaCBsYW5ndWFnZSBhcnJheSBpcyBkZWNsYXJlZCBpbiB0aGUgbG9jYWxpemUgYXJyYXkKICAgIC8vIHRoaXMgaXMgdXNlZCBhcyBpbiAgdzNjX3NsaWR5LmxvY2FsaXplKCJmb28iKTsKICAgIHRoaXMuc3RyaW5ncyA9IHsKICAgICAgImVzIjp0aGlzLnN0cmluZ3NfZXMsCiAgICAgICJjYSI6dGhpcy5zdHJpbmdzX2NhLAogICAgICAiY3MiOnRoaXMuc3RyaW5nc19jcywKICAgICAgIm5sIjp0aGlzLnN0cmluZ3NfbmwsCiAgICAgICJkZSI6dGhpcy5zdHJpbmdzX2RlLAogICAgICAicGwiOnRoaXMuc3RyaW5nc19wbCwKICAgICAgImZyIjp0aGlzLnN0cmluZ3NfZnIsCiAgICAgICJodSI6dGhpcy5zdHJpbmdzX2h1LAogICAgICAiaXQiOnRoaXMuc3RyaW5nc19pdCwKICAgICAgImVsIjp0aGlzLnN0cmluZ3NfZWwsCiAgICAgICJqcCI6dGhpcy5zdHJpbmdzX2phLAogICAgICAiemgiOnRoaXMuc3RyaW5nc196aCwKICAgICAgInJ1Ijp0aGlzLnN0cmluZ3NfcnUsCiAgICAgICJzdiI6dGhpcy5zdHJpbmdzX3N2CiAgICB9LAoKICAgIGkxOG4uc3RyaW5nc19lc1toZWxwX3RleHRdID0gaTE4bi5oZWxwX2VzOwogICAgaTE4bi5zdHJpbmdzX2NhW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfY2E7CiAgICBpMThuLnN0cmluZ3NfY3NbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9jczsKICAgIGkxOG4uc3RyaW5nc19ubFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX25sOwogICAgaTE4bi5zdHJpbmdzX2RlW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfZGU7CiAgICBpMThuLnN0cmluZ3NfcGxbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9wbDsKICAgIGkxOG4uc3RyaW5nc19mcltoZWxwX3RleHRdID0gaTE4bi5oZWxwX2ZyOwogICAgaTE4bi5zdHJpbmdzX2h1W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfaHU7CiAgICBpMThuLnN0cmluZ3NfaXRbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9pdDsKICAgIGkxOG4uc3RyaW5nc19lbFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX2VsOwogICAgaTE4bi5zdHJpbmdzX2phW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfamE7CiAgICBpMThuLnN0cmluZ3NfemhbaGVscF90ZXh0XSA9IGkxOG4uaGVscF96aDsKICAgIGkxOG4uc3RyaW5nc19ydVtoZWxwX3RleHRdID0gaTE4bi5oZWxwX3J1OwogICAgaTE4bi5zdHJpbmdzX3N2W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfc3Y7CgogICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJsYW5nIik7CgogICAgaWYgKCF3M2Nfc2xpZHkubGFuZykKICAgICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpOwoKICAgIGlmICghdzNjX3NsaWR5LmxhbmcpCiAgICAgIHczY19zbGlkeS5sYW5nID0gImVuIjsKICB9Cn07CgovLyBoYWNrIGZvciBiYWNrIGJ1dHRvbiBiZWhhdmlvcgppZiAodzNjX3NsaWR5LmllNiB8fCB3M2Nfc2xpZHkuaWU3KQp7CiAgZG9jdW1lbnQud3JpdGUoIjxpZnJhbWUgaWQ9J2hpc3RvcnlGcmFtZScgIiArCiAgInNyYz0namF2YXNjcmlwdDpcIjxodG1sIisiPjwvIisiaHRtbD5cIicgIiArCiAgImhlaWdodD0nMScgd2lkdGg9JzEnICIgKwogICJzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7bGVmdDotODAwcHgnPjwvaWZyYW1lPiIpOwp9CgovLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIGZvciBpbml0aWFsaXphdGlvbgp3M2Nfc2xpZHkuc2V0X3VwKCk7CgovLyBoaWRlIHRoZSBzbGlkZXMgYXMgc29vbiBhcyBib2R5IGVsZW1lbnQgaXMgYXZhaWxhYmxlCi8vIHRvIHJlZHVjZSBhbm5veWluZyBzY3JlZW4gbWVzcyBiZWZvcmUgdGhlIG9ubG9hZCBldmVudApzZXRUaW1lb3V0KHczY19zbGlkeS5oaWRlX3NsaWRlcywgNTApOwoK"></script>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">機器學習簡介</h1>
<p class="author">
郭耀仁
</p>
<p class="date">2017-08-04</p>
</div>
<div class="slide section level2">
<h2>機器學習的定位</h2>
<div class="figure">
<img src="data:image/jpeg;base64,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MgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAA4QklNBAIAAAAAAAIAADhCSU0EMAAAAAAAAQEAOEJJTQQtAAAAAAAGAAEAAAACOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0kAAAAGAAAAAAAAAAAAAAHWAAADeQAAAAoAVQBuAHQAaQB0AGwAZQBkAC0AMQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAADeQAAAdYAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAdYAAAAAUmdodGxvbmcAAAN5AAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAHWAAAAAFJnaHRsb25nAAADeQAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EFAAAAAAABAAAAAM4QklNBAwAAAAADFMAAAABAAAAoAAAAFUAAAHgAACfYAAADDcAGAAB/9j/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAFUAoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APVUklndUysGm6luTlfZrC17qh4j212OmPzW2/8Any3/AASSnRSWI/N6QHuH279I0bm7Q5zg20tuZYz6fqM2WfzzfYnb1XozHm2zqLNtQLi0mAJn3e7/AI32/wCESU7SSxHZnS67Tj/tEi2o+k9oLjtcCz9D7fay13s/Q/zii/O6XWGub1BtTHsFriZYQ14d6Tz9HZ7t3stRU7qSxa+odMu3CrqJ3NYS4EukCPpbXQ5rv9f539IrNfXejgNr+2MJEN3OJEn+u7/poKdFJUsbrPTMuxtePkNe9+jWwQZA9Tb7gNr9nu2K6kpSSSSSlJJJJKUkkoveytpfY4Ma3lzjACSmSSzL+vYrNKmPuP7wG1v+c/3f9BCHXMhwBbRWC6Sys2+9wE/Qb6f8l39f/Bo0UWHYSWPV9Yqj/O0uaPFhD/8A0mtLHy8bKaXUWB8cjgj+sw+5qVFNv//Q9VVa+vNdkVuosrbTBFzHsLif3SxzXNVlJJTmDE641oAycaWgAD0HAaD/AI47FJ+L1Y2lzbscs3OLXPpJfsJJGO5zbGN2NZ7fUWikkpzXY/XXVsBycbedwtHouLCD6e3Y02797Nt3uc/Z+k/mk32fr2o+04xggBxpdJAH0rIuHu3/AKT2LTSSUwYwbGh4aXBoBgacapzVW6NzGnbO2QNJG0x/ZUkklLbWzMCefmmc1r2lrhIPIKkkkpF9mx/9GPuS+zY/+jH3IqSFDsnil3KL7Nj/AOjH3JfZsf8A0Y+5FSSodlcUu5aea/Cw6TbZWD2Ywcud+6Fzt9lmZaN7RJMV1t0aPh/6Uci9RzDl5TngzUyW1DtHd/8A1xVk8RA6BaZy7n7WQxLGkvFcEwCe8CY0n83cr2JfbjMj7KLchktrsdALWu93pn8/9/8Az1ml/hqiMoyra3XV1OfW3l4BI8P7W389PGM1sAPsYjnje5kfD1bMhi5AAHpkgDyTAXUPbYN1TxOx3B0+khCwkRJ2nWAdPipAzrykYkbhMckJfKX/0fVVWyjmgt+yhpBa4OLuzjt9N/I+j7/arKyet10ufWbKcu2a7GE4g/Mdt312QR/OQ3a1IGkEWKuvJtG3qROlLWgOJEkHc33aGHex30f9fYnZZ1Dexr6m7Cfc6dQI8lkN9NhsLqOqkmsjdve4ji5zKff9N3osZ7f+LSfVj1sLK8LqLDbXU0ek4w3YxjmCt/q7qXVNZ6Vvt/SWf6V6N+ARw/1i6wu6jAmgEgMB9wEmf0p+l9H9xIv6l/o2cDWdJj3T7lktpqfYKxj9TrfZO+ze4APAAbud6jq3/R9P1v5Hv/fTgVtqJNfVnevU4OO9+5gBDO1g9O/2fo/S9/8A24jfgFcP9Yu1i23Wsc61npuDyA0gjQcc/SR1z2M2gP8AVbhdSBoi1jHuMF270zs9S0fpH+va+1u7+b9RFw8j7NY59eP1K/cPTPrkuEtOjmV2va39Lud+lQKQKHd3ElWws37W1zvQux9piL2bCf5TdXKw7cWnYQHdiRI+6WoJXSQtuT/pGf5h/wDSqW3J/wBIz/MP/pVC/BNDuPxSqr1O404F9jdHbdrT4F3sb/1SLtyf9Iz/ADD/AOlVS6y3I/Z1m57CJZIDCPz2/wDCIg67KIFbj8XngI0Ci53bsnO8A6j7j/5JQh3iPuP/AJJT4x1pqcxKqgJDXU7strwY2mfCD2VzHz200sY6lz7KA/0nB21sWe1/q17dtm1v0fU9VVBkZUkOtJbAgDQyPMkpzffpNh0Mtk90MnMYonhmdews/wDRTg5LmMg48USYn9I8MYn+77jAAxwT8kgSCiHIyDzY7iOVF732PL3mXGJPHGikhkhkFxIkP5dGDLhyYJATiYS3F/8Acyj8z//S9VVe/EN19dwvtq9MEGtjoY8H/SMcHKwgZGZVjOaLJhwJ3CNAC1v9b8/8xAkDUpAJNAWWm3o1gP8Ayjllm0AAvbM67nl+z85SPSbCzYeoZf0y8uD2BxBa2v0pbT7a27fVb6ex/qI7eo4riGhxklrdWkau+iOP5SX7SxB9JxaRqREx7jV+bLfpN+ihxx7hd7c/3T9jXf0i01MZX1DKrLA4B28OJLjvmwvZvdt/M9/sTjo74bPUMwkFxJ3t908TFX5n5uxHPUcaRBcZj806yNzdunu/M/z0WjIqvaXVHc1piYIExOkoiQOxCDCQFmJAQ4mDZjWOe7LvvDhBZaWlo49zNrGbeFbSSRWqSSSSUpJJJJSkDOoORh3Uj6Tmnb/WGrP+kjpJKeLJlsqK0usYJxsg2NH6G8kg9g86vZ/a+mxZvHKnE6xzI3iDIf4rVnjEs+IS+Wcowl5Gfq/6SlYoNbanB7xWbvaXiXODACXtdW3/AEr/AE2+5qAAXODRyTA+asNqcA0Pxp7bt20n5BZAsm9/N6SVACOw7Co/LtVtbtqkp2VvY73N2btWiZ0lQ7qxyUpDOB+8CJf4vE0/ikIy5WUjVwMZQP8AekIH/pP/0/VVR6i7OY9hxTjiWPH6wS0hx27LGbQ7e1v+Er9n9dXlm9Vxrbn1mvBozSARuvft2mRt9vp2+oxJSJlvUzL3Hp/taG0Q55mxxbs98exvoer7GfTSpt6l6jSbsK6kskubIcX+mHOs/Ob6bcqux/8AxNn/AAH6at+zLT6n+RcRu9x3TbIc0uax/t9H2epT7tn0Gf8AXLFMYN7LHFvRsRzXtaA5r2tc1r69uRU79E7dts/Rbq/5yn0/9ElSbPdJVldXe0ONvT/33lj3uDQw7Lm7js3tb6VzPX9np/6H9EmNvVgXHBd04ssL7WkveNzTu9Eu2Nfu+j+ktUsTAfc9tfUel4rK2M2ssrIdG06V+mWe2r3WP/nPz1bs6L0i0NFmHS4M+iCwaSdxSRZYVXdR+2Q+zFfiOc6NpcLQ3VtQAlzLHep/Of6+ndbbU9xax7XOAkgEExx/BVndH6U5rGuxKSKhFfsb7Qd30NPb/OWIuNg4WI57saiuk2BoeWNDZDBsrB2/uNSUnTOLg0lo3HsJhOkkpFvv/wBEP87/AGJb7/8ARD/O/wBiKkhXimx2H4ot9/8Aoh/nf7Et9/8Aoh/nf7EVJKvFVjsPxa9zH31OqtpDmPEEF3+xc9n9Ky8Yl7WGyns8GSB/wrQ3/pt9i6lJOjIxNgrZxjMUYj/nPENcSdWw2BDpBk+CeF1eR0vAyCXWUjceXNlp+ZZt3Kqfq7gzo+0Dw3D+LVXnywJuBofuy6f4UW7i56QjWSPER+lD9L+9GX/fvPEnjmOB4I+Jh5GW/bSzcAfc/ho/rO/779Nb9XQ+m1EE1mwjvYS7/o/Q/wCir7WtY0NYA1o4AEAKXDAYrI1mdOL90f1WvzOaXMECQ4ccTxcA14pfvTl/3D//1PVUl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKfqpJfKqSSn6qSXyqkkp+qkl8qpJKf/2QA4QklNBCEAAAAAAF0AAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAAXAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBDACAAMgAwADEANQAAAAEAOEJJTQQGAAAAAAAHAAQAAAABAQD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wgARCAFlAqQDAREAAhEBAxEB/8QAHAABAAEFAQEAAAAAAAAAAAAAAAUBAgMEBgcI/8QAGwEBAQADAQEBAAAAAAAAAAAAAAECAwQFBgf/2gAMAwEAAhADEAAAAfqkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQFAAAABCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEXGhVdSzSS2yfxz1bMka2Ul8M4/LDNLo2bcutlNWWSTNMsaZFyxhsxktMqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5HPXjXaMBoZTdxVLljzLlj1WrZx+3XK43AsZZJmDG4s8csyx3GTwyhcpPY2Azx9A1bMigAAAAAAAAAAAAAAAAAAAAAAAAAAAACxCkxl5Uxl5jMhetiVMZaZiiw1xuskccs6kxlpsqAAAAAAAAAAAAAAAAAABrJB5YxOWMfZq1jq+XOm/LKY5TeOUjKAAAAB5vEkuS44pVmLDPTzwyl0svZoV0MvP42EzxkI0DtJYI2Tn02K3jppeessjWrYJBYKNyzcOwUAAAAAAAAAAAAAChCZY8nnhCZ40Ajo8ci4Eg88QBI43qcM+mwyyKAAAOExtpF5Y9Zjeeym1jlcjPGCw2buesdNjlC2XmqblbmF18sYfHNcclbEsmkbQ2ZefskVySK3Y7SqqBFc/Xhx2AAAAAAAAAAAa1nGbdUPlKmlxenL+v86M8srjYvKdzqz8+3awABt43ttefRY51AABzMb9li6cm0a5vLDHQVoplWw2052WbIdJC29MkuSpQAAAAAAAoVAAAAAAAAAAKRyWzDjNuu0ogwaOzPv5AO81bJzDLZPJd+rBYAABMYZematoAA8wwuzs16WGzUymXG33GTMmOXN5zKmch69DxvCl0u4kZbky15pl0kd7aAAAAAAAAAAAAAAAAAKHB7dfMZ4AAAAT2GXRYZcznjC54gAAC89h594AAoBBChQAQoAAEKKgAAAAAAAAAAAAAAAAFDgtmrmdmIA3cbWqxaWJWqy46yJctIx2UKLcYSyy89h594AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHH7NfF7MABcTGGVmUpjlW44jcjSM60MlWSSUukYKGnlNWy89h594AAAAAAAAAAAAAAAAAAAAAAAAAAAAAibj5nv1WgAAAACAoCsUoAC89h594AAAAAAAAAAAAAAAAAAAAAAAAAAAAFp5hu0xmUAAAApnpt38dufNTZqpZWGG27Dfdp67tXUABeew8+8AAAAAAAAAAAAAAAAAAAAAAAAAAAADnMsfPt2oAAAW7eXH1eXbt5gBva92js0gCuG3Jzelfz+gBeew8+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAI8w36YrKAABccXZ5Fm/hAA73zvb6Lm7oHo4vPvS8MAC7X05eH2a47bz2Hn3gACgKwoUQoqAIUABRKqAAAAAAAAAAAAAAAAI+4+V79QAAplhi7vCt2aAAN3Xu9S8n6Pyb1/mvWPI+l8z9X5+N28wAFcc8vD7mXX0ew8+8AAcR2+TJ6ujXy172G6hE7uaS077MsdnHZhuM7z9kF08e1hsRjyxxpZZiuG5huqYctfQ8/fUAAAAAAAAAAAAAAHI54cTt1gALjh7/AAbdmgAAD0DzvcnebsiN/N5z6fgAAAVmex5/uex8neAAOW6fPjN3NWZYM9W3r3buG3Vy16+zVK6Ornuni7rz/X5Xs87Fcc+OevlrmNPXguETv5Zzn7IfdzXnd8Hs1AAAAAAAAAAAAAAB53t1c/niAEYu7xrN/CAAABJauiN284AAAF8vtPifWgAC1ECtAtJAFVlolKrC2sKA0s9Uds557n7RWgAAAAAAAAAAAAAPKt2nQygAt28uHv8ADIBvat9a1stebHLHlLEsyxzY5WhagoltmO4i+X2nxPrQAB5bErZzcsmRMvfZY8Rjl19x89Xq7jpyylnOknLhWTsiJdyzpJlxaYMsZshF9CjkItX06y5QAAAAAAAAAABQ8h6NGIAGHv8ACt28oFV6Dm7sNwzTPBljWLkjtmmT1dFqXzLX2a8mGeZY/PTG7uYXy+0+J9aAAOUTWloly50kViCaTTl27Iesxli2tSWNskDZN2XVRWA2TZlhrNqOsqqgAACM0dWtr3AAAAAAAUPL+jRQAtz1Yu/wwABp8HsS3ufI0GObl9GuroZ6qdXnNmkC6UW2C+X2nxPrQABzeKGyiXImiynrjjxypljprInM4We2YZMcoM7OzlY6qomW2yLl066VN6WGs35edjbym3GzW1LPUABbFUAAAAAAAoeQ9OmxAXH0+Zi6/KAAGDk9LPljX537V5X0jDaAYvT8N7/xb0fFogAvl9p8T60AAcHihK2Ljhxy2rd9jAR0dqOazxldeexlNFMqz9nLS9WcZZLLzxv1fjOwqBliI3MptlcbGVMnd0AAAAAAAAAAPJd+nVsAxdvi2b+IAAPE+rr8z98xzAAAD2/k303wVMsAL5fafE+tAAELEgayZTIVXGmVa2ViAlsrpjVqslVpZqS7dVSsVXYoAAAAAAAAAAAAAAeZbtMRlAjD6PgW7OcAFeH9XX5j9AAFSV6OK1Yvn7SAr2PmH1f51RBfL7T4n1oAA8hxu1nhp45aCx7GdMC6Vnex5jMpklU3K5U1orU/cYnDOUzxj5dWumk9KrcUAAAAAAAAAAAAADhdmvldmAS4PR+dps0gByenX4j9XTIAbWzT1Pf43H+b7tkyAAfU/ntPa+WJfL7T4n1oAAoICzBGe1CystKQArBGegRKoIrQAAAAAAAAAAAAAAgMsfOt2oJcPo/PW7NAAr8j+lvK+iIAK1PdXmS/Tw8V5f0NAAN3LT7v8gZYXy+0+J9aAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaeS79WGwYu7xLN3GA1b6/BfsiUADpe7x4Xl9He3c8Py99AAB9h+Z09P5++X2nxPrQAAAAAAAAAAAAAAAAAAAAAAAAAAAAOG2a+U2YDH1eXj6vMAr5vuvjv08AAoIAAAH0PxVPoviL5fafE+tAAAAAAAAAAAAAAAAAAAAAAAAAAAAA008q36rLLdnPh9DwSCvj/TvlP0UADf282fZryZYUxaerp0te8AB7fylPqPz6+X2nxPrQAAhSFAAIUALJb7AAAAAAAAAAAAAAAAAAABxmevjtuAwej8/TPQK+T9G+S/SQAM+WvLnrGbLDWw262vcAA935Gn03wN8vtPifWgADjPN9y/LG+47WempH6unrO/x+b4/Uz3XkywxzPHjlgx2UNvZosxyV03b5VVAAAAAAAAAAAAAAAAAFh5ju1RmWNu/hw9vjCvL6L4b9cIC7WzRVKS5c8KyWKXS1dAAfUfn9Pb+Tvl9p8T60AAcn5/sZMsIrn7dzboz5a4Xm7+79X57k/O9ilua67GUnv5NbVt1Md0pv44Hi9PNtw7f0/n6gAAAAAAAAAAAAAAAAAGinmO/Vr2Yu/wrNvKK/Dfrrl7wXe3827nzWzLDNlIWyW3i5vi9ggWU+6/IHRx3y+0+J9aAAKRWrC4sxuGbNnLVjrJCkKti6y2XBhs08N8rv5KFxYXgAAAAAAAAAAAAAAAAEXcfNt2rXz14fQ8CmWuvifWPl/0EgABSApAHsfM0+r/ADlLscXr+ycPrAADyaTfrncbv1GR6FlOCwzn2POZJDPDtNWzh8pp1L3GKxy7qzl5cUsFlPSGPm0z6Q6i4dkyAAAAAFIrQAAAAAAAAAEdZ51u1aGzRh7/AAqXCvx36hZ5vvX3AAAAAN3LT7f8nbebLx+zm5+32HRvAAHNmOKJetUkVjKmY1yIsmIxFq6Vm6b0umR5lN6zTl2TJZLKKFQAAACM0dWvhuAAAAAAAAAAFicpt1c1s04uzybbjH/Ifpc1r3gAAAN3M+w/MHX5+Xi9mW0dnb6s5mZAADlZNA0F2jesh5ZQgiYMdS0cdXWYo2zIsLlOr15ctt1z2OWGWTsiZbjeNM0rj6MyAAAAAAAAAAAAAAAAENceM264Pq82zo4HgfZvB+vY7CApA9X519P8FfjskOT1ew07enxyqoAAHIRoWbUvPLLMamsbCjZXcmOvklMbCZTRl37JPG8blN42o6OoXG61WF1mSu8lAAAAAAAAAAAAAAAAAEXZzmzXAdHDG5a7fP8Aapx+k1b2et1efX0PF3Nmue5u7ote6cxyuAAAAIGMiRCzZgSFWaTXl0cpMLrYofOSWNmakQAAAAAAAAAAAAAAAAAAAAAAAAIw2R2TWuOJL12Mbvy7RVQAAAAB5gkJZPYZc1nJHG7kax05yGUuMuGWPPGyXo7j6DMq0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAtEAACAgIBAgUFAQACAwEAAAADBAIFAQYAERUSExQgMBAWMUBQITOAIiMyNP/aAAgBAQABBQL/AKtWLRFxVrc2gd1R6o2kWsyfkKtEbOF2LBVWU2PG0S1SFN5mcTNEkJdZ+Pow2SZ5p2w2DztUYEaOTFiNg2eQdEBUNiofI7RIpC2KYJDcXKEFiozPuqOSf3WZHYtFJFVsqMcPT1RRQmPp2F/phaBgrWpZiJYHbkYcv+N7/wDGTpmsPGMLhIgxuLYjlWccQcj/APMyeVDw4mlCITiBCE7rEc5rcNKnWDgRkR46Q/uYjDGcwhnMYxhzyQ4J5Y/DmEM8IEReeCHPIDmflw5nGM48sfTwx6+SLxyXXnLwQ6+XDjSJZnTRIE+F14y8MfFiEMcgAI85WXzP+OVkAOFvVI8JfsZ5O3sJcy+7Lnq2eYecxyNrYR5C+cjwWwBzwNgmx8mw3ztc/YbQFBnO01+AX945VHntaUGmNikwGq2uM0s7UFhQ+2LpDnsSkBt7ciqZyzAkZXa698WvbORquV2aOVVdmKs7a24auP3arkf3JEiE9nJO0js4PXZ25QYR2MO342mGFJbaqIH3kHGT7asBiexKQWV2sniltyglgbF5737zVuqvxi4cPzOc5z9fJUro90XlxlUEwewFg2txa9FPkJwJH4C6lXumU1ogQz1yffLmrLY4hqeA2Q9fdBAutebBvWvVCttafGk5rLjcTajjL97Ud5ra/U16+1BrXkqray5XYNrXmqX9FC6ipr+QEPqEiQBqryMc6YpJZfXWwKI0AlqSWv2Z1ftgpst656oUddsXmGtWZMRvVvV8FrE/SP0Jn7T2Gs0wE7zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX87zX8NsFYHDd7lvnqgc9UDncg+o+gcxwa5wTDwgGPJSu9Ir7l2jqySuQsfADYKs9ona1ljJi5qVDnvUfRkuqgJ53aZF8Wlblw2wpp22XU8SLeUwJCt6o2IXVQVdN9GwHV7Ii8XFrWTcpNiSthYvqWWbGzElGdvVDbHZV5Wv4v+csLjEOSnKefrkAcl+tWaL6yyolYyz0wYmCl94bRwMPdZU9kw7WI2BrW3oWnZXGvPnxZa600B6ifnYUqdhXMOU5mbSdTeqjnrrpFWaW1DMevW5+VyBlbkdJbZzW68+s6nQPLrKUFw7YDoLw9SxSW04Vibtab+JnOMYsrXJviqngpS78lxm0ZMT4Mf3s/wCctbPz8+ya2YLjSZJISkySMv4M+nJDGFi+OK/jawA8oTVPCMFZ+bJfEYZWYjHK545kA0M+mP45RlCXMf3rmw8Ptx0zmbYCZ9SP1oShDgLIh4jIIh5YVjgRoReEyOMgsBHz1A4y88coMdBEwyKBQMjHEJAA4yTzCcx/dsXMJr5zmWf1sf3M56csG8uM/D1xzxc8Wedc86551zzxZ54ueLHux/cumvJX+DOedc59uEm8i9uJezH9yzY9Q378y91fXoMoREGAnK6vWQ9vXpzH+/THydf575/Tqe/OevuS8nLQsBiGcjef0jJWxwDDfuxnrzHvtDuQecellCsbLBYVr4jltYwMdvyrXFgJxQdgummraQZPO5hHIyRLCsMUjTNjgBoWYiLBs/MY7vCRp3Qo5dbAwme0EuUNqAq+Lf8A8/39gL0H7s56/BWtorV+PTTg46gzX/BHOOnuILM7uvVP60HqwIjx5rYWJVjMfHO5iOfjkInpjQlm7CMQIKQgNZdrKLZ8eB//AEFeDHjsamEosIQnjnlF7PGE++TjKAFSiwx+/dk8b3tln4sWLcQfDj4unOnydOdOdONqDcBGs8U/335eNz2Z/HsYUIuYyZRGiIs5SWJ5fky6eUXxyjKGTBkEuQlxLyTeLyD88qWY+UXxzGQWfpj3ukYTvvuMmVqm5skF8beQazu1Wpa160NV095eXYa1acaTXqW7ayjZP2K2lv7W5XlDfWFizU3FilwG0WEzoXrUhVmynfYluhJCjtbBZ2lx2pkW2Ftq6vvHw1KF3YN5q7mxRI3ZSWtD7Y1Abu5ZXexnr+0XPiL7M/n64/MmwZlgq8snOE2RtRjODI4DGyLo2TzJZKvF/wA4OZEZFjgmcRxBkUMKSiWD2Jeb9Me9nXwOMS1ZCbQtVQEf7XQJnsApplqwM1v2wnID1YvYqOUKDhS1apqueuCzkuvrka7Al6fGvo4FnV0sDQ1WI0IaqiADWugdjcUyd4lDXa4bc9eQIP7aUiT7fR8myqA2ec6ml6L7eWg18LFkkrPvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzvdXzN1V9Mtr9fVr89Wvz1a/Mtr89Svz1K/PUr89Svz1K/PUr8JYhgT4sSlHOc5ln6Y9871TDdbtYnKnO2LzsA7IuMZdq6m+4EYM52JOZE7mItZludNHjeyViZXNsL0S2esYEHaKosR7YHNoCwgypW7gq3U11mraBX2arZKhtNTYzsNpD2yw2wfZGNjrVWbO4TqYA22nYLDYEJu2W2L9qNsypESbVUhansdbBxG5UsT+3p+hn8S/yf1ln3yAEk/mx7yUj5L/GtXOKxDWrGrizq1jNNrXLIkl6i2r31tSsY2RqI5dSdozsssaabLDmuvkLZ61OzIxrVpbc7JdMMUFa1Vpra1cJqU9WZOFRpxayUNbbgAWl2Plt6vbWYWtSJK0s60jx5a6zlcepWGbSNBd5pbXXWLArGusGTxqMxW1ZSvKXP6zMfCx9Zfn9XHvDb1x3xMrMci5HLMXUpYy0rGfqF/Mg4mSM2AD5AwSDwYOeOXqSEe/o+v646QcTLGTakOSaVgEjSw4hfFIM2lRQIysGEmVoT9Qv5371rDwP/AFz+fjSWESLoVx/Dj32NSzm0pEs5uLypccYstZxgTqfrHja+2VfsndSnq7uwS1hDC9fmq2NTj+tNem7QvZWfbrQ2iQqSkTKrJSRKa0gGt16HrG6m08COvRmwvWMK4sKRw1iuuypsyh5Mrfu34+hvrn8/EvABJzXRFXyxjEvgx8XTg1wil7un1muEhOns6fTp+/dB81L65/PxYx4s2ssQZmspAPwY/tkhgkDCyEv0l+fiFKtnwp/NZ7q16j4Mf3L5bwE+kv1sf3GwRZBOEhz5n8fCjGM2Rw9aGVbnxdvxmZQjiL34/UzOMf5N4l9c/n4AlkAmWZ9MtS8YWYQYIeRI+/HvZANm7hiVbZStWZ8Na/8AqXsSyn3h3IAkwYVL/wAh7BjLIbArCiz7GXF7Fto3dnJxbZCwuawZi2O3zlKL7+GP4so4nGwTkkbksfBAWJAgsYkcLkkP0THWKk8TwmfI/SG8v3Y97Q3R2i6jZ3IIyWk4gSUQCxGK/ri1qwvIXXxZJEMmSLhlTyQUTLGwqlzA4oqca2UmvQiXNi3MEqyaufRNfxm1RthYARYvJY94ChwKD0YjG4IYMNQ9Su1EMINRxM2RyX92PhjKE8cnHE4rLiVFwZBGj9f8xzEoSjjpnGJQlw64WRhrVQk/zHIyjPHJTjDH8N9EbozAIuT8/qRj/nus1+23eNgc9LWP2tYtPZ7NAFha7GWosn26ah2B29DXWqskNG9YaVbrJJyeu7QlTOu2iwtR0NhaJVtTZWthBV22rS3r1iuype33ihsbhrCo2ZxXXNefs3OGldTqG9itqqOvP2Tkf4TiQnBtJmTnnHXnT65nCMvlxjmPeTXqkrstZpZuD1ilC2HXKcOQ67VBWxWJ+gDrdOBdlJdtTtSHrD6tTMYdq0rFGFPXDbjS1sYG1mlPjNNXZEZJdg3Z6/EAazSrsZ1ymzCvqlKyEtfqpFYp65rNfWKVg/kOgJifaV+dpX52lfnaV+dpX52lfnaV+dpX52lfnaV+dpX52lfnaV+dpX52lfnaV+dpX52lfnaV+dpX52lfnaV+TpVCYd12QeemhzK8cc8iPC12CG+P88xjpxOvYcyGqTEP3ZvetgvtQTlHuUS8+7RSgjsizxSbQyR7OyeCwrNjafRBtITmr9sC8WxuvRtMXrNpbWd9291PblnMtbDAiFXsNmVmqswM1SOzGS13O0KYEDbE2G6W672EW2BIwDbUjtg2FdgamzydQFfSsrH+E3VrN8aqmluZj8mI8XTYZypSBFzGMYx7+yMisFdYIHK2uRWwfW7Bexjq5AQDrBFhKafhWzV1eS4VdXICS2tRXBYU7B3U9bCiwSsxO4X1gYQg1M4+C1ya56+jTRTPosSrZ1+Wdlr9WxWuU9b2muxrccK1+qxrXFdWMsyTVetPWatGun/EYrlGeHoCY4WtbDzMc45/vs/3nTPBJnNwFC1PgKZMPMYxHHwnvadVk1zVrNq7ZStHJaV4ud8qMO2+0IpJnvKlXFxeKVVKlsiHpCXVSJ099Xx5Da0hWMLsWHkbBKyD/TmEJOSqkJ8zRo552FPmKJHHI06EeDUWF81hQusYZ1qxlYEpnzZV1e7k3KjuMgPr706CdLZqovI2jmqWuu2JbG0pdgbeLUXcpsU92MzmrWhBUylhXj/7K//EAEMRAAEDAgIFBwoDBwMFAAAAAAEAAgMEESExBRIVQVEQEyBhcaHRBhQiMDJCUFKBklORwSMzQGCx4fAWcoAkNGJz8f/aAAgBAwEBPwH/AItE4IHcrhA3V1uV0Srpx5GnDFawOC1kXAJxyW9A2GKurhXQN1dX+POxNlk5NzQ9pDIo+wjmju5Nw5PdTswsnLqR3LeVuHJusveXFAjJDKyH8nEXQGN+jb4RdawWsVrFXV1cq5WsVrq49YRgrZda8LrddE2TR6YaUzGyGNutAXtZA3/K6vhdbroe1ZBFHeV18uYCzcPr3K6GKBBx5TgjgvetyHD+PJWt0fZWsrYX6N7IO9VfFNNtU8EfZDVuRQNn6wTcAAgLBo4KM2smCzR2K2SCGBBQwARXHrW6xRF1vJ60MArZHt70E3A3WQsrXW8nqsjvRxW89a4o9GKhnnbrsGHaFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKnh3hbMqeHeFsyp4d4WzKr5e8I6NqR7vePFHR9Wfd7x4rZlX8vePFbMq/l7x4r/AE3UeZmqLgDnbq7eg7kAsOneyDvUEW6HatyOGaOFuk70Tbk325DlcrJHDP4OXctlZNrqlsBpg86nDoDFAW5D6jWPTviFbII5jsXge9bz2Lj2J2Jur+kE3CxKbhqoe79Vx7EU/G/WnekSUcbq+IKIwI6kcb9aNyST8GLvVNNlrhE/yQ436NsLqyt0DnblsrYctlb+QXHd0rq6vy7rI53V9/JdXwRV+S6Px8m38qk39U+oii9op2kR7oTq6Y70amY+8ufl+ZecS/Mm1kw3pukD7wTKyJ+9DHL+QXH1M1XHFhmVLVSS55dEU8pbr6uHRjmfF7JUNe12EizxHx89NzgwazlUVjpMGYDpU1NBLB2oNYG82p6WCKE9KGpfCepRTNmF2/HTl05JGxN1nKed05uculT6vOjXyTdUM/Zpxfr/APksDH+0VSGCY83l0mPdGdZqp6hs7ev1FZJKJbRnIXU1R+wDmZuVLM5rHl+Nk2ru8Nc0i6kqwx5Y1pNlLNq1Af1JtS2eN26yZUshiacbFRVYlfzZFinVoBOqLgJjg8awVM9zpXtO5S1QjdqAXKbVNfGZAEyr1n825pBXngL9RrSTdOrmgkBpNlNMyWEPxspKpsTtTMqOrY9hccLLz3EAsOPwB3Sc4MGs5Tzmd1z6ikmhigvdDmyOcU88MkJN/UNcWHWaoqqOVut03sJqx2Kmhdz2o7JqZzjI5CwY3Qu+SMi543THmllfrNzWLqpr7blqnXmRY7mYhbepAfPGndZMY2K7Jb/RQNDYwGqOXzeV5LTipf33OOuAeC9iFzoL4qP0pmEX+qpGkSSE8VTNIfLdajvNALb1qnzu/UnCwnuFE9uu3nb9XwB2fSrZ+cdqNyHqhVShupfD4JNEJmajkKS9td17fADn0aubmY7bz0ZoHRO1VJA5j9UYoMc42ARidqhwWpcDVWo6+rZOBbgU9mo7VRY8GxC5t17WXNv4LUuBbeubcDayc0twd6pyO9Pw1it6GP5IZXTMx1pgum4uHWo/SYCUMhdXTsHOt/mSPooi1+3l3K18k0gnDime71r3Qnejf/OCJtZcepHD4BVyc5KTu6JmZdx4ZIPYTnuUkjJC4NNsv6JsoBYL5ITNDRY7nd5TZm+jrcCFM7WIRc0Tc5da7bhrjhjldGVoyOOrZNltqC+9Nma21j8ygdrAA7gVUA3HZ6o4o4o4o8gwQwN1utyN9HBZch39aIvdZrK/byjAIYIYW6uS3KfVQUVRUt14m3C2VWfItlVnyLZVZ8i2VWfItlVnyLZVZ8i2VWfItlVnyLZVZ8i2VWfItlVnyLZVZ8i2VWfItlVnyLZVZ8i2VWfItlVv4f8ARbKrfwz3LZVb+Ge5bKrfwz3KfRlc2MkRnu8VsPSP4R/MeK2HpH8I93ith6R/CPd4rYekfwj3eK2HpH8I93ith6R/CPd4ql8jK+ppXVJIaRk05m3ZgOVrHPNmC56lHoXSEvswn+i/05pL8PvCfoLSMecRUsEsBtK0jtHQBIxCJJxPqt9kMVuvyDE2C3XW8BNxWfIBcgIXPJa9vqgbrf0OpNxW666+TLkyCyRw/ibBWCsFpEiwarBWCsFYKwVgqfS1dRwGmgkLWHMKh0ZU6RdaBv13Ki8laaH0qn0z3KKCKnFomgdBzQ8WcLqs8naGq9kah6vBaR0DVaP9O2s3iP1HrsluRxv1pp1XArKy3gpvo96bgR1K2CBsQUMGtbwXUgt90cbrfrLehguF0NwWYRysjjrdaJx+qtbBOxFupHE/RHFHP+HOfQrzebp6G8nTVAT1WDOG8/2UcbIWhkYsB6jNaY8m21F56PB3DcU9pYdVwsfWnpZ8p3FZ/CDn0Kk3ld0vJ3QvnJ87qB6IyHFZdGrqHxlsUPtOVJNI4ujmzHR0/oUVzPOIB+0Hf/f1ZOSO5OOH0/VC1/p4p3Xw5BuuhfEFXxusBhwxW4DtV8G9p/RDfZDPFe4e0fqs7o4j6o43R/VHq4lHqRH8e/oVH713R0To86SqRFuzPYmMbG3UZkOjUPljZeJusU2eokqjKI7luFkwkjHpeU+jBTS+dxj0XZ9v9/jzsuhUi0ruj5NUXmtHzjvafj9N3SJ1RdaObrROf8xKZPM+TzPX359KtpW1tO+B29PY6JxY7MfHjy1zbTdCmgNRM2Ib0GhgDRu6UratmtC3EO38FHDzcAiHCy2dDzQj796GHS8pabzeuLh72Pj8ecOXSLcndDybi53SLL7rn+A8sYsIZe0fr8eI5aqPnIiOh5Ji9ef9p/TpVhLYSWp7vNJMTdtjn1IV4sXOG668+Oq42yUcri8xvFj0vK4f9Iz/AHfp/DBpdl8JcOWoj5qQt5fJZ+rpC3EHpTRCVmo5CmbiXYk8UKcapa4khS0xMJYHE9qjgER1r36Xlg+0ETOJ9TDM+DR2uzO6faupHSuHpNTdHxNsyRx1nfkotHem/nDYNU1ExobJEfROHWtmQCTmC/0tykYY3Fh3LSuDYuxQ0UXNCWckXyspaNkM/NyO9HO6no4xBz8JNutT0MNOzWe/EjBDR0DHNEj/AGlTU8kMssbXWsFFQxcw2eV9gn6NtUNiY7Ap1HTGJ0rHH0fg55K6HnGa4zHLomfzeujk6/64dF0hErWcbp9RGw2d/wDO1GdgfqH+y87isTwRqWOaS027V51Hr6nXb6o1UYdqfTo+Vs+vVMi+Uf19TTyU76PmJX2xU1TDDB5vBjfMp9YJwHsl1OIVLWNDpGPfnk5TSOJY0za+Km82jq+fe6xG5TSc7IX8VOaSqazWktYKGra6ARtk1C3vUNRG2p1pX62Gdt6qKphpnROk1nLSM0c2pqHIKpqInzROacrXTauEVEr74EYKWaM0LIr+kCo5WT1EWpjqt/JVA86hdzUmWJwt8HsjgupVUPMvwyPLourFbSMm37+3f0JY5C9skdsL5p9I5zy6zTftTqWR8uuThe65hxhMd8Sf1upad0hcRv1e7FOp3ODhfN11HrCXEbzxw6+HQLg0XK0hU+eVT5+J7t3rQS03CnmdUPMj8/VRTPgdrxmxUldNK3UOXUPhBF1ZSxtlbquUkbonaruTyW0jzMxpH5Py7f7+u8ptI+bU/m7Paf8A05LXwCioWNb6efTdijhf6fon4axW9D9E3K5TcwokzP8ALvQ9kdpWeS60z2hbitydmVuRHtdSyd9VbHkPvditZX+BkXRFlPA2dtipIzEdVyDi06wWg9LDSUNne2M/FBjnC4Hq6yrioYTNLkO/qVZWSV0xnlzKAJNgqWlEXpPz9Rmjj0BghhihghhbkGHSzv1o4m/JZZ8lvWw1b4G6rQPqAVtKXg37R4LaUvBv2jwW0peDftHgtpS8G/aPBbSl4N+0eC2lLwb9o8FtKXg37R4LaUvBv2jwW0peDftHgtpS8G/aPBbSl4N+0eC2lLwb9o8FtKXg37R4LaUvBv2jwW0peDftHgtpS8G/aPBbSl4N+0eC2lLwb9o8FtKXg37R4LaUvBv2jwW0peDftHgtpS8G/aPBHSMhza37W+CNdJua37G+CfWPfmxn2N8FNW1MB9hlv/W3wUOnaqB/ORBgP+xvgtDeUsWkYC0D0+HqqyrhoYudnNgtK6Uk0pLrO9kZBRxumdZoVPStg7UArdPqXWEcOQmyOA+qIsuP+b0cEcOQ5cgxTDfVPEoe6m+1YpnpBZYo4chwRwXFbyEeHX8DLU5nFTUAdjFggZaV4cLhwWjfKljgI63A/MP1UcjZW68ZuOrp6R8pKajGpD6burJVdZUaQl5yY3PDgoaAnGRRxhgswINt6kk58mYI4o4g9qzzRxunYrj1o4o436+XeEMBbrQwt1IYW6kM7pvohbgEcTdAI7+tHFcUMrIi/wAFIunRhwsVJQRuxGChjrKI61M+yg8pq2LCePW7kzyspT+8Y4d6HlTo3i78k/yroh7AcfopvKqd/wD28Vu1VE+kdI/vnYcMh+QUejmj2jdRwtZ7IstX1pwNuiMeXfZbro/FrBagXNtWo1aoVvXcVuXvXRxx/wAt/n9U7eQveJ/zJcQm4IZBHKy33TfRDepbvp+q6/8Akt//xAA+EQABAwEFBAgDBwMEAwEAAAABAAIRAwQSITFRFCBBYQUQEyIwUnGRMlChFSNAQoGxwWDR8DOAkuEGNHLx/9oACAECAQE/Af8Aa00SURxCgotwUYrigJQCDSU0a9Tm44ItIRbggCU0ZrgCiJKiFdKhEQohR8+bgJWbcE8p3wo/EE34yvywE3CVGC/Mer86bkUcWhc0OK/K1cSipxlT3VoiDmjmj/QE+HPWDCJwjdn5REoMKuBXAroV1QFdCLArig+IM1Oa/wDxD4oQEo/BeTyGyjhPJHAmUcPeFGMLjCPwzyTuK4puMBcY6pXwl0ocf0+vU43UcMF6IYpvejmgJjmo7oK0Qx/HhpKDRu4uV0qTMHdIlFkeFGEJwvAg8VPeLlxQKju3Sni8SibznE8U/EFOxd+sqZRzTiSCNUTJJ5R1Ti3kvzT1RhHKE7vEqf4+nU7EQjiZQMZLgBzlNwg6Y/VN7pB0XADRZEFDDdfaadMw4rbKOq2yjqtso6rbKOq2yjqtso6rbKOq2yjqtso6rbKOq2yjqtso6rbKOq2yjqtso6rbKOq2yjqtso6rbKOq2yjqtso6rbKOq2yjqha6Ov0KFqs4/N9D/ZbbQ830K22h5vof7L7Yo7R2AH69ZTclki6TvkSi0+AMZPVmvRTouKGKbjPVy3Bjj1DFod1ZlDHJDHL5O1m6bLRNTti3vbjsCiZ6h4BaN8CAfWf2XEnVDL9UMz6hDIDmtPVNwEIg3SBmnYyE7Ek80cZ9QtPWUMJTe7dOibgAhPd5D+EPhPogcQeclN/LyQODR8ma3wnCVcKDdf6Ia2N2cYUqVKlSgZEqVKlSpUqVP9Atbx3oRGaIUYIyoxUQ2EWnFQgoQUKCoMIfP2if6VaI8JtNzskLNqhZ2Bdm0cFdbouzbojQYUbPoU6i9v8AQTBj4LKTn4ptJrN3tmTd3XMa/NPoEfD/AEA3LfAkwFTohuJ3q1WoyopdN5U61R9Qbz6YfmnsNMwfnoxO+1pcYCZTDN6reuG6nST30Lt1SQ7uKjeNPvbzgHCCqlI0zy8CzsYacuCp0vvC13BV2C80NwTqENvAym0JEkwmU71EjmjRdTcE6i6o88k+gWNvIWYnMpwLcCq7Q1jSEyiXi8TARokOup1CG3wZWzmLxKbZyQCSqbHMeWptAuF5OoODruq2fCZ+QM3gCcAqbLg8CvTqPqZLvA3FTp1GVB4BE4J9ItMb4dFBVajezvDMp9x723ske61wKc3t2Ng5LAUC3miRdpoOF+ogfuCE4l8FkKqSXGU6n2rGiUzGncESF8VQNqQn4U3Awq5Ba1VSLrEHt7clT9xHNAyaaqNJabnyBmW9Rp3RJ8I0WF175Ix5puvBdvAN0R8gblu0WXjusqB4lNqBzbxRcBmV2gmFezlXhEoQck114SrzTjKvNzlX26q9qrwiUHB2XhMQExz/AO1TxDRqhJAR4eoR+K6E7EeiqYZJ2DSNFV7roGqOZUJuLWpveA5oGY9FH7L+y4wVqqjXBv6KqILuSeO8ZTcQ3/NU0Xp9P5Qxjmhj8gpNut3RTMD6oh3DVNY5kSJRZN7BdmScdQnMOMaqmIxUOLLkK47MIMOnFGni7BXDj+iqi6SRqFRy8IYId3JDBDBFHFESIXGVCd3sevKOSGEclELT06uMqMZRxBCJvSdVOJOqnLl1jwqlop0jDytts/mW22fzLbbP5lttn8y22z+ZbbZ/Mtts/mW22fzLbbP5lttn8y22z+ZbbZ/Mtts/mW22fzLbbP5lttn8y26z+dbbZ/Otts/nW22fzplssxOL19o2Xzj6r7SsvnH1X2lZfOPqvtKy+cfVfaVl84+q+0bL5x9VX/8AILNRrilnz06y4N+Iwn9IWVmb19q2TzJvSVlf+dMqMqfAZ3PVenhThKOCzMIYgLhPUfhJRwWXU8kNlOwnq1WXVz69ERis1y6hiJ6uOCGKGP4yzDM79WxWevVFao2XBWm10rKJqFWjpmtUwpYBPqPqYvM7gluLVR6WtNHMyOasvSVG093I+LGaMkyvzTyhNERyR7wurVflI5J2Kd3mkIulx9ZTm3wQnYucdY+i43hmterKERLbqJlHGeYRzkclImUMEMHShhd5IDCOUJxvG8U3AzzBQGXqm91DL8OMtygO5v2/pUUfu6GLtU5znuvOOPgZKwdLGl91XxH7JpDhI8MY9Q6s96VxI8HP5A3LcpfAN7pXpDsh2FLPjvUabXAvqZBV2MbDqfHd6M6Q2dwp1Ph/bw25H1/shx5pnxCdf4TcAPX+yZkPVHh/nFHInijgRCIwhYn9cE7Mn0RGLvQfyjwKI0U97lB/hZAShn+gQ4IACfRNyx0CHNTAUR+OZuU/gG7bbULJRv8AHgi4v7zs92mGOPfMJ1OkKIYXYFOEHPe6Htfas7F2Y/b8RHyZhx3KXwDd6XtHbV7gybvROCtRh4bojSptb293hlvWesaFUVBwTXB4vDj8+BnroGWblaoKVM1DwRJcZO800HQ84RwT6l599bU+/e3+iK3a2YDTD58zrs5mW7nSz7lkPP8AAdAv+Nnz4GCh1UnXXbnTf/rD13qPx4801vbtyxlbMTAC7CSOae0ABw3ug/8AXd6fhiQM/lLD103Xmz19NNmy/qN5j7hvBGq7hgu1M3gEyr3w4hPqF2G90C3717uXgvYKtqLXaJk2et2YOBRtTzLmjup9qwbczKZaSbweMQtsqFvaXcE114SrDje9U+0PvltMZJtd1SneaMVTrvNTs3qlaX1T3RgtrqOBLW5KrUa8McRmnWh/aGmxqba/ui8jEJtet2gY4fJ2mR1UHwY67bT7Wzubu3Jpl+iFJxGCDCW3l2Dsl2RmCuxfErsXXb270HTu0XVNT+3g1G1WV+0YJVKk99TtaqbQNPuup3lWoHuODcuCawBru5CZ2r6ApgJjbjQ1Uu3ozDcyn0C2oXFl4FVKTzSAY2FRouFYVLsBWRjqbTeVOi8Unt1Ro1LlMRkmU3C0OfwTmGnScDxKo/dVRfbifk8wgZ6qVS+OrNWyibPWcw7lN7LhY7ihXAaBiIQrNDLvJdqO0v8AJMqhoa31Qqi9PKFUILDHLcAkwFZaPYUW09PFIvCExgpi63wqlNtUQ5Ms9NhvDP5Q03VMpriwymuDhI6umbL2tPtm5t8boiy9rV7V2Tf3631zPd324YIYwNUzENCGICdw9QnZwEcQf0VU6aj91UyLtJ+iPxH0CmCiMP0VX83opxKbkP1/coCStOai80zonY/qjlgh+T1/lAyY5x9Fw+RgwgZTHlhTXBwkIi9gV0jYTY6mHwnJXhMeHZ6D7S8U2cVQoMs1MU2LmqtW9gPAGCHdWSjCOo4rkiJREzzXGUcVrzRx3Mo5LhHXl49Sg2oZM+62Rmp9ytkZqfcrZGan3K2Rmp9ytkZqfcrZGan3K2Rmp9ytkZqfcrZGan3K2Rmp9ytkZqfcrZGan3K2Rmp9ytkZqfcrZGan3K2Rmp9ytkZqfcrZGan3K2Rmp9ytkZqfcrZGan3K2Rmp9ytlbqfcoWdmrv8AkULO1pwc7/kVTs1J/wCZ3/Iqp0bRqi68uj/6K6Q6IfZat6e7r4VCg+0vuU1YrG2xsgZ8U5waJKqVS/0RdCvHfGOPXp6Sh3stJ/hDEj0Uo4R/nBDFDHqbmryd3JlVAW3m6J4i9yVQkMJGiqQ1y5IHDqGKGIlT+0rRDH2/n5GHIOlMtBGDkblZsZhWzoVwN6z+yc1zDdeIO/ZOiatoxf3WqhZ6dkZdp5J9ojBqc+c0Xzl4IGEdXEFaDQLLL0XEekIYdQ1WijgpREtLdU7vGeUI4zPEJxknmnCRCJvFDMlAQIRxTREcv+0MBCjCOUJ2JBUx7fJQ4hCpCbaTxTzRtAisFU6Hs78aboTug6w+FwK+xrXy90OhLQfiICp9CU2/6j/ZUaNksv8AptxT7UeCdVLs0Xnw8+od4T15/wCc46nG6jgY6icJCj90Mp+bXiu0cu0cr7leKk+MMh6/yECsm4IEDD/J/wA/ZM4TwTcA31/mUeB4p+OXJZkzxKb8QPNR3SE/v3uZ/sjnPP8Ahcv9y3//xABNEAABAwMCAwQFCQQHBgQHAAABAgMEABESEyEFMUEUIjJRIzNhcZEVMEJSgZOUodEgNEBQJGBicpKisQYQQ4LB4RaA8PElU2NzssLS/9oACAEBAAY/Av8AytJDFtVxWKb0S7bNBsqgA9zv0NLbWUpXc4WB3FKX2wOuKUQhQTamlN8SPecGWYvv5Vg653vIC9RtKWkIcF8beOi2p3cbGyTtUPRd7rq97dRTjiOaUkimn5bgSXNuVFtt25TvypbSyB3rNWB71aantxsdtqiNtuHBy9x51PvIx0z3Sd8aaW+/mVjYgeL7KIbd3SLm4tag0h3c8tudKQ47ZSOYtRkIcGmOZ8q02nN+e4tWnrdbXtt8f58BHQlfZh9I7Xpxp9KUdoGVgdr04vEX1CL1IYWQHC4qwp7+/wD9RUD++ipBlHHId0moK2fAQbbWqQlTrTQBI0sN1Vwr+9+lPf3DUIHq5UbEAd01LaUQla19wUth6chnc5JUjeuHIC8gE8/OuKe+uHuAgFKDurw1LcbfQ464clBHQUwFcSbGJGKMN71IySDZA5/ZUxKOQf8AyrRjEaukbADltQac4g20n6hRuDSRe+389JCQCedZFIuOtWSkD3Vq6ac/O1YYJx8rUAUjbltXpGkqt5igcB3eW3KtTSTl52odxPd5bcqsRQGCbDltWRSLjrWrppz87b1mplBV52oHEXHKj3E97ntzpuRHUgFsWwUO7Tkp5Sc3BayBsKzSygK87VkEi560bJAvz2q7bSU38hWZZRl52/lF3XUp95r0YW59lq9GyhPv3r19vcmt5Lnxr95c/wAVbSXPjX7yT7xXfS2r7LV6ZlSfdvXo3038jt842iHiWYqUyJtxvpKVjt5dVf8ALT0ZPD5Ukx2UyHVNAYpbN9+fsqU/g5/Ri13bbualsCn33rhzcXhy5PbHtNViLjuk23POiyY72ih4R3JHdwS4enO/MgXqaIMKVgy28lMuw09RAP28xztTYnQ5Tbgg9qCnEgayUgZEfHrUkmLMhnsS5bK1oF1oA8SR5jbY0f6HMlJjx0PSHG0D0d03F9+furiDhad/+GsJfc9oKSrb4UtBjvLbYCDIdTazWQuL777HpURp1KrS3NNK+gNr7/CmVxUuKMiSuKlPUFIJKvdYX+0VCansykvSI5UmQtIxdUkb2qGiPFmcQecjIfcwSkKSg8lK3/IVxBqcxJcYb4hoB8JGDIITiD9pprJpbrr68GmkWuo2v1qPoQJTz0hbjQZQBklaOYO9vtpqdF4bKf1CpKmxiC2UmxBubc6jvQI8mZFk8P7QhppIv4+Zv7KXPVIV8nfJqZITjvfO3x6VIVKhvsvRwhWirElQWrFJuDbnR4jLaXGQhClrC7XSB7q7W/wqayFlCY6VJF3yrkE7/wCtOLkwJbT7TzbK45SCu6/DyO96VrcJnNBh1LUkqSmzBVbG++/McqfbVAl6MV4MPyMRptk2sefLepUotO4xZYhq9qipIv7u8K4kriPDXWWoT+ihQscztZPPmb086/CkodYcbbUxYKX3zZJFjY0jh44ZJS9ilTwJR6HK9r778un8fiDqK8k1ZKtJPkn9auTc/sIVLa1nVi+HRNYu8Naw9ldthE6fJaDzT+z6N4keStxWMlGmfPpWSFBQPl8zOkcTT2hyYrnuMEY2Cf8AX41JQ9OLq5EBuEVY/VChl/mrhJGZYhxQH1fRcU36v4Ek1FcjyAy/EeD7ZUnIXsRuPtpUxlUMtuva69WLk4FdcVX5VJhM8UAgP6xDWj3kly+2Xlc0wjtVtHh7kHw88gnvf5aba7VbDhzsDw/XAGX5VP8AkubbtURLbrendTikIxGJ6XFSezcS7MjiEVDMlBayPdTbY9Oe9KmsKiHWw1RIi6hulIF0m+2wpUJL5YcCkuNOgeBaTcGvlFp84COGktW2SvEJK/gkCuFxu1X+TkLRfHx3TjUdXC+KJZcRFbiPKWznklHJQ8juanxe1fvsxMu+PhsUG3+So6sm0uxVlbeq3qINxYgpqC8txgGGXCUss6aVZDypoIltK03X14vM6iPSKvfG/iHnUT5O4uGlxofY7qZyChle/OlQzIXpGEInLe4Vln8akNJd4chx2w9HBASoeSxfenOCvulxDwcC8e6AF9EjoBfam2JXGUqXEW2uKtLFsVI6q371xtSpEyeHJbklh9a0t4ps0dkgfH41xNrtNvlB5t7w+DHH/wDmuJsSZelAlTA4prT3cSAnwq6XtUhtnienEky0TVtaV1agKTbLy7tcQZXMHZ5riZCU6dyh0W39o7vKjHdchtq7Q09eNG0x3FXtzqPNVLbS3HcS4mzPpRb6Of1T1/ZLTrhCh/ZNeuP3aq9cfu1V64/dqr1x+7VXrj92qvXH7tVeuP3aq9cfu1V64/dqr1x+7VXrj92qvXH7tVeuP3aq9cfu1V64/dqr1x+7VXrj92qvXH7tVeuP3aq9cfu1V64/dqr1x+7VXrj92qvXEn6uBrHVwR9UA14/8prx/kaDASogm2X+9sr5BQvRK+RAx91YMtlRp4OHJSxvb9vJldvZ0oNvejc/I/MSOEJlI7RGAKgVDf8A9qWmBxCPILfiDTgVauzSuJRmndhgt0A78qkyYEuHJMawWO0BKUm/VXSuyvcTioeyw01OgKv5UmRw6VFkp10MqPaAALm3Pz9nWvk4T4/av/k6gz+FPcPnvsRm22W3EuOOY5FRULf5acSZLV2kaqxl4UfW921JQ/xSK2V4lIU6BfLlTymuJRlCP60h0dz3+VGW3xOMpkKCC4HRiFeVF6DLZkIBsVNrCt6civyI7MkSHWUM6oyVibXtR4emfHMkc2tQZfCkJVIjolKz9AHQVWCiOVOhPFoh0Bd2zw7g9tEJWwXhgdNx4I7pWE3v9tDh7nEYyZJ5NF0ZfCjCbmsrkJvdsLGQtz2/k5ZiWKuq+grJaiSep/Y1i2nPz/YLElAWW9t+opSWhYKVlRNKcS2EBR8I+Y00uXA89/2+MNMMDT4pFQhD+YshSUkWI571FnyOFp4eiHFUwU6iVapNvq/RFvzr/aBaIiFqmxW2o5JG5ANx7N7VNRBiICXuHsMJAIF1pcvb4VxoCG2tcyYw43e3eQnTv/oqpjseMnRck8PcRZQGzau/+VLhP8KS4gyXX+26ieSiSNvFlvauJSlRULQ/w5Mdom3i79x+YpYY4eJCpfCm4Z9ME6biQrn/AIulcWQuIhTkjhDMRi5HrAhYI9m5TSnOGRWUn5MRHF8bagVyt8fZU1UiK6pMmVCcAkONlRQhXfvjtXFJJaCGZJZLdutkWNOQDwptCXOKdt7XqJ2QHMuXPLp9tNMTWZjrbMxclLqX2tLckg2tnfe1q4TaI2l2NMdeeNxyUF7+3mKZ+WY7mj2aQw/3mtPv29WlO9vfUlXEGgqetyKyjvj1LK0m9/b3lVN4UOHIUJc7tInaie4nK/LxZDkKmOjhyVqmcSKyrMAhogd/8uX8luaLEY2b6n63zThdCu8ByFeF3/DS9N5SWzyT7P6kGOwfRjmfrfspkZc+afLyoJ0lDLqaQiygpS8TtyqyEu3yxspNL1ULSUi42pAdbUhK1AXtRjBXUi/urUDSym172pCyg2c5UG3kqRcE/lQVdRu0HOVZqZUE+dBKmVAq5C3OkhTSgVctudaeirLna1YrSQR0P9QDEZO/0z/0/ZAJsOtOt6WKVpxCrnp4aQ8ScAkD/LTKNS+m9kTbpakXvs4om3kRzp1sPFzJAHK3WrNkW1UL8JvYeda5PcyUai3UbNJIV+dRnSd2gUFNvfvSBqIwAV4GyOYrC++ihv7cqLwTZKHQpYKT3/dTZDiMA5mcWyKRmTs4on2AjnS2tULC0+JSDYb+VXySoAADFNh/PyoeNWyRWSjcnn/VO5or+gNk/O8651z/AKi6KT3ndvs+f1wwrTte/s/a3/qAs37qe6Pnh3cirxK6g12UeHHG1+lLunHHcL63/qI471tt882H7ad978q/ouOPTHlRUoq1b/begJmPhGd+VLEbHT2tjy+fUmO8pIba1MaaXHVZciyUVIXIWt3Sct5mksPRnWS54cutKZajuvafjKOlIexcUCzsgc6fuHGi2DkPpCoxUXVJc2BPP7aMcsuNLtcZdRSyiO6422bKcHIUlxBulQuKmJccKghdk36V2dtlbzlrkJ6CjJShw2OJQB3r0Izsdxlat05da0G2HVqC8TYcvbS0ojurU2SFWH50y/qPJSpf0Oddm03FrsCAkc6ckKCkaXiB6U2hcN5Jd8HLcfyBtn6xy+fB1McfGDzvQl4J8OWVulLJcuk7ADnf+A7yDgWLE22oNPJOnEyxqYphCgvV226VEcb7S4ArvKcHWpKHo7itRWSSkXvTbxbUAWfLlXE+4rvDbbnXDBpq7q99uVNqCTbRIvalxpva0G/hb5KFNoQFBITsFc6llcZ5Wa9sU0qS/wBobaeSCFN8/cadd4cl/vOd4rHe99RnG+0LRvdbnnU0qQRd3a4qfdBF1G23Oo6dNVw7ytWeBx0edq4nkjxLFstutR1S1SLpGLWaLD+QY/USB/AdmDvo7Y2t0/khZcvY+VNqkSlvBrdAP8geV/a+aDJ7xVyt1rRT6U2v3BeilDaiRzAFIcSlSsgSbJ8O9JwClFQvYJrT0l5/VtvRStJBHQ0WTuR5UEFpYUeQtvWGkvIdLb0fQubc+7SCgKUVX2xrT0l5fVtvVnG1JPtFvmlP8XkTmoq3WxFeZX6BP9hxPtPU+fSi/wBmTtxQ8Ptl01McqLr8ZC4J4k6wXS76TvOkA28r2FcQly4zTfY7/wBHzOtfLEZAjkfMVNEREdMiOGlh1sqLdlKsRuPFRnzGUqeSANNs7FZNgLn31xKE/HYjzEQzIbW06SnDkenMUZMpKGxGYLqwlZUOV+Z3risR/iiZL/YzObWhYOnknvI/5Vf60OIQ3B2lMNtea/7ouaEFbMTtLccPu3cUEm5Nkp257VpcL4e2UNtsuPl9woUNQXsBbmBSy7FSuG5xV6PqF3v3LhtYeXSm1u8OaTDcnqgBYduvLIgKtbltUeDwuGhch9yUsh99WKUNulJN9zubbVCjuw0tGUJOQzvgWlAWqKltlht+Ql5w6yyEJShwo6Dma4eEw246JjYXlJUUjLK2ANufXf2VED6UiNIzSp2/gUE5D8gqm0ph6L0hmSXklW7IQn/un40zG4lDSEu8KXIZUh8lasEC4V5HfpTUThUFpaWI8db5eeNxmm9htvt1NSC7GQ5Dc4w9G1C73wVOECw8qg8PDYImal1X8OKb00tMVhsOSJDJdeWQ2nTXiLkDYmn2GWGnG4riW3BkdRZNr4C3S9X/AIpavNR+adcyupCypn23rdwXDSEi5IF+t7U6luQG8nErysd+7UUaxxbyz+NIxcspMdaPtJpCVqF9At3VfY39lCxQcUY9y9vzrteshSfLe42ptC3G8E5H0efP216N0X7OW+7fnf21EGqQELJX8abs5YpQ6PdflSQpRJQysL5+dJJtbAY8+X2/NF2TLluMlwOmMp30WQ5beW3LlXadaSE9p7Xohz0ere+VqDuvKU2HzJ0FO3b1L3ytTxluyJWs0WfTOXwRe9h9tt/ZT8KXOlyUPpxOq5un3UeFy1OPtqTipSz3j7b+dSmpMiTJXLa0FuuruoI8hQgyMi1kgkD6WJvY+zakvFvTUltxk6e2SVixBr5HcBMcs6HPfG1qbdTxCa2+hvSU8lwZOJveytq7W3LlsuFKEO6TuOsE8sqEbv4iV2zn9PLL/WkMjPFuZ24b/wDEyy+G9MpZekMLYW6pLrTllekVdQ91R2X33mn4rjxbdZc72C1Ha/utUZqI/JjrihaUOoX38VKyKTfmL023ImzFtICQpsu91zE3F/8AtRgTQrTKgrumx2qbNQhQXOb03LHYC1tvKmGlalo8VcRG/wBBQAP+lNux5MuOUtNsr0ncdRKPDlRY9JiZnbuf/Eyy+F6ZcW68y7HUVNuNKxULix/Khw9Euahj0maQ96wLNyFfrzoyIkmVFC8dRtldkLxFh+XzWnIkBCudrV+9p+Br97T8DX72n4Gv3tPwNfvafga/e0/A1+9p+Br97T8DX72n4Gv3tPwNfvafga/e0/A1+9p+Br97T8DX72n4Gv3tPwNH0o5160V60V60V60V6wV6wV6wV6wV6wV6wUGwCq/UdPm7pUQfYauokn2/NOwm2pDq2b5ltkqSFY5Y387UzxN3h81Kntg2hhSiT7PZ7agRosWQ+1NbU4HENnu2Nv8A38qSH1rkOuPPISmPHVeyF2O3s23ri8YRnWPk5GQfWyVI8N9//W9IgnWddsjMtMqKUZcsj0vTkVtL7b2m4pousqSlzHniTzqNxzia9uytvPFKfMC+1LCu1hTQzWnsy7pb+vy8PtrTWp1YSlK3FttlSWknkVEcq43Hiw3kOcNaybeU33D3L/8AtTinHFtFhgSFl1oou39cX5inVOKdj6LWurXaUi7f1hfmKf1dVmFHhB9YdZKV5Z2+24pUtMeQnG921tEL+FMcSkxZDKn1YIa0iVOK/sedF+KVd1RQtK0lKkKHQg1ptqdsoKLa1NEIdx54nrSER1PDUaLzalsqSHEjnj52riDkIPMyY0VUhAfYKLp6KseYqa9BK0TI8UPpDzJTkPrC/MUqM6XfRlKXXEtEttFXIKV0ppcsr9O5pNhCColVr2291NNIL4LjmjdTCgEOfUUehoQSl9tSipKFuMqShZTzAJ51Kl8N1gWkZodWwrTWMgCQetSXIzymHY2mVa8dXJZ2OPUGnIjinrsuhl1eirBCja11ct7iuxku7OBlTgaOmlw8klXK9LZipeIRkNUtENqINjZXv/h1e/5sOLbBUOv8MniaHIzLQPfU1kHHk42wWPCffUXhvaoq24bigEZOIS830ztvceXKuGKjyYynIWqhzIKxUhar7e2hGYdh5677qXjmHGc1khSCOu/KuKttS2FNcUjJQpSwcw4lGN/K1OOwJEXQlqbW/qJVmkpSEnH3gU3NlSmHC0H06mSyt3MEC99hbyFJ/wBn9ZAdEVDGf0bpt+lcRfS8gdsgpiJB6KGW/wDmouoRCkpeabQ6mQpwYlKcdseYPka4s3HejCPxSOEbg5NrSjEfZSs5AQhXD+ybC5CsgQr3bU+5xeXGQ6YhiNdnSbC6grI39qRtUibxBzhrjjsPsoZ01FrxX71+d/ypUeU+lZLhUhCVKKWk9EAq3IqE2zKhl3hbqjGyCsXG1XuF+R36VKdmuockTnS89piyBtaw+wUhpTUFxDDa0NSLuau4sO74RzrhDSZqW18NiORytI3yU2EhQ+FSw9JjpckwDDySpxZKvrqKv9KldvmRdVULsLGmlQTbIEqV8BtUiW21CkMy3Q8vtCnApB2BsE7K5da4c6haUiFJ1zfqMFC350tnXburign9fDkDb37U1Mly2XQ084suFSy44lQVtbwptfpS+AvSoZYbaS0ytKVZKsRYq8th0qatt9tIlMR2hfoULKjXFI4fbBnTUyUn6oGGx/wU5KSzCfYeldqJeU5mg3uQAO6d+VPcQccjNMrCgW4+QDqifGpJ2B93P+HdT5LP8he4Y1KbMli2aL770rQfbcwNlYKBsaeYcRgGse+VCyr0gplsnUOKO+O8fIUGlSGgtRxCSoXJ8q0ddvPfu5b7UVtymVJCsSQsWv5UrUeQnAZKurkPOtZt1CmyL5A7WpIDqDmMk78xT78pQTGYaDheyBB3ta3OkRNVvTXH7QH9QYeLG1XvWbcplSSrC4WD3vL30rOS0nHxXWNq7QuQ0lr65UMfjWTkhtIIuCVDlTj8jGOhtwoutabbda1HJLSU45ZFYAt50HXpDaEK5KUoAGkNLfbStzwJKhdXurs+u3q2vhl3re7+Pd9ve/gHJEkkMtDe3U+VNPRicHU3xJ3H8BxrsfDiHuIRU9mkpQAAoJIUMuhNR5ULgjnDGGIqmpGTYRrLNrDbnax39tcWT2NbjchyBbbxpSvv1x5cLg6Q4SyYWDY2ItfDy3rj0djgy35j0ltLEoJFmjgjr9G3Ov8AaB1qIBNkO2ZdOylowTcA9L7ipPYODucLjmFpYrbDeT4UCg2H1bc/bXyvJhutvvSm1vx8AtQaQmwGJ2V3rqtT6VJkYyHlLwfYDVrjeyByFdqYhvqXwm8GIm/rWlZd/wDNv/Ca4hw9iJqp+SGmGieSnEqV+dR5C+B4xUcOWhLbzAAQ4V8sfOkcNQFomdkCMSe9fyqbpQZutIS0whCoqY6G1g7Od36vnXBovFOEOS3WpckyBhl2lWF9UX8Xu+yokjsTzcRL8lzsqWEvKaCyMPRnbz9164UmVDdfjR4sg/0podxZcSUjHkNr2pt4xniy3PlOLQlhLpso91WB5/8AeuDpkwnX4zLcpREloDAqUmwx5DrYVAXxLgb02KyiQyGA2F6ZLndOJ/s7X6VJ1osxtmVo9nLEVDpZCUju5fQsadejcLeW06pxx9bzKe6cdi25z3sO7TT62FslxIUW1+JPsP8AHNu/WFvn7SHtJPna9IYM7FLqtQKx8VHE3HQ/wji220pU6clkDxH5pt1bSVLavgojdN/5MVDm2cvn8R1ptkC4YQkWo8UEY2KNmrbA+f8AUQoVyULUppXNJt88zJWvSWyO82B4rUqSRzVlY0p82OQxw+jb+oqZKRsvuq9/9VVsq+kKLaxYpNj84lK0gjfY+6tm0JcSpIBSLA3pKUKVuvDvC3202M1JC1FPeG/K9JeacKklWO4tv/Gd5QF/P+U9sbHsX+vzgdTa486SlsJbCTlZA60HENtoWDlkkUh0soQEkk4D2UEYoSkG9kjr8/ou3KdK9r03GbcUWXh4VG9qcdjMNllo2OStzTHZ28nJA7oPIU6w+2kOtJz7p2IoSkwxpDxHKkup5KF6mf8A3aXGhtNqLfiKzatZiPdwKwKb8qEOU02CpNwUKvWDUVOKHMXFX6U4WIaTok5EnpUR9yPlm4OvhNOQ48YOKSARvTsh1qy2VYlPtpqO6w16XfZXT+TFKhcHnWP0FeE/NOPXN0FI+NZJA35DLdXuouDGwGVst7edqQmybr3SMhSUrTkFAkYq8qDgCbFOY7wuRRc7gATlYq3t892yPG1BhjztQmzQlGIslApbbvC+097urBqM6iIkhsWWzenlp4b2b0Z3vua7IzGyQ59O9NtfVTan9ODmHHCrxUuQ5A7Qh0XsDuk1jHiaPpLqbSrmKakJhaDQSdr3qRqoxydJFTELbsXFKx9tRGtLvNuZKHkKekFHo1NgA/CpmqnHVe7vtFNdoiKCnO6lWplb+Tlpf2HyNFp0bj8/mXGXs7LxN0+ykthbydO4SUhO9aYSoEtlBAAsT5+dIexNkoCfytTaSk9zP8xamlYnuM6dW1Ej0SRkMe97PP8AgLoUD02/3FJ5Hagy0O6P92o04laT1Sbj9nNKgUnqKuKOKgbGxtWk8jJNB0JJUORUq9qvQUlQIPIj/ddagB7f5JidlDwqotOpsR/C7/tr4xxWMqTFW60GpCHiFRDsnHH6pPl50XfR5DjBgcv+Hq4/G1dsS7HVCPFHGCxgdQ5vEZZX8zytyriL/EEp7QwkqaiaJG2eIUF3743FTk6rjBZ0lolGKpm91WKLX/OjLdUiTJQEpyxwSVqNgT5DeuKcJlTmFudhMlL7TRTZN7FJF/galR8mwRFNyy3pD7AOVf8AhDVc7Uh0srVfvdlAzz/w2T764SFLUb8DSdz1zFQpKinsi3tKQT9G6Tifj/rTMRxlDb7heU+m3JkIyT/+aPzrhUaUuO7Gm8PXpIS2QW8EX3N+9cVEhcMciREx4MeQ5m0VBeY8I32G3OuIzmXWDE+WdJbRQc1ZlCb5X2teuHQuGrZQuc6psrdTkEgIKr2+yo0iY5EUyqerhy0IbIKiCRqXvty5V2UvokRZaH0oUmMpCU4g8lk9+mltNpCYjMaKlpSSVqWvH0n93fbzqS1xBlz0RTpPKYLOoCPqnyriqpXEUycOKhplKkEYkOp638PsqdElaMiSy5HS0420QPTHqm/Sx99Po4gysaSxpuqYLWoP7p8v5Hi4N/oq8qwdG3RXQ/shBWATyF/4b5Qci5O5Z7rOOXnjyvXb1QxragevkbZj6VuV6E5uGA6Fl3xG2Z+lblf20/jDB7QkoWFqKhifoi/Ie6nogZWpqQMXEuOqXt9p2r5MU1nGw08FnK4+2n4qIt0SU4O5LKlKT5XO9qXCkN5MuJwUn2Uqf2dPaFs6BX1w8qjpUw4nsrWi3pvLRZHlsaVw6ayHY6gAUq62pyciMkPvNBlavNA6VGbEYYw0KbZF/CkixHwqOFxP3ZsNIssjuD6JtzHvpxjs4wdfElQ83Lg3/IUxIdbyXGUVtn6pIt/oaSjs4smQZQ3/AOJe9/zrtLUOyxlj3zZOXOw6Uhswk4oY7MB/9PoKU3EDllm5zcUs/nT7xjd6StLjneNipJuDb7KkGRGSvtSUpdv9LHw/Ci1EC7KNzm4pZ/P53UW48Dy7rqkj8q9dK/EL/WvXSvxC/wBa9dK/EL/WvXSvxC/1r10r8Qv9a9dK/EL/AFr10r8Qv9a9dK/EL/WvXSvxC/1r10r8Qv8AWvXSvxC/1r10r8Qv9a9dK/EL/WvXSvxC/wBa9dK/EL/WvXSvxC/1r10r8Qv9a9dK/EL/AFr10r8Qv9a9dK/EL/WvXSvxC/1r10r8Qv8AWsVrkKHkX1frRXGU84jy1DcV4nf8ZrxOf4zXjc/xmg6HTbrfc/PXQLI+saxLWZ81ftuQo0CQ+hhYQ+8nHBtR36nytTH9Aktxpay2xJVbBw/G4vbamNPg04iUpaGDZPpFp5jn7DvUUM8OlOvynHWdFOOSFt+IHe1RWEsOockaqSlVvRqb8QNcOag8NccalOPtr3SDds28/tpPDnOHPoW6VpZJUj0hSL8r3HLrXC5c5p6KqVILfcxKXNlc/IbVHvBktxZbmkxJVbBaunW4vbaoyfk+Uy1MWtpl1dsVLTfbn7DSIMaC/MkKQXcGrDFHmSa4Mzw4SkRZSHHVlBSk3SQLG/l1pHD2uHSJb7jKnwlq3hBsefvptQgym2pDK32HFgDUCefXamlMIcQubBelNHbuYpB3+NRoDsVa21cKZlLfum+RG6qiudsycfYC06pSHFbeQqBOnRX5OUUPPPApHv5nc+6n16LuTL7bAR1XnbEj2b03HSy4GnnVMNvZJspY9l79DvRktQX2WfoLct397G3wpDZ4fKQyuUYeuQMNW9rc79OdIZSy5ouvKjtv5JspYv0vfod6gOJZcHyg4tpF7d3EKO/+GvlGPweWWiQEZFCcudzueQtXB1xS400+uSh5pVvEhPL4/wAjvbBf1k1fDUR5prb5zerMtkjz6VlJOory6VYD5h+TD4iWWJbgdkM6QVkq1jY9LgCozDvElOwoK9SOxpgEHpkrrauGDtJPya444O748kqH/wC1QlcOlFNpUyUt7AEI1N8SOoqM5E4mpEthx1xTymwrULni7v8A65VB0OJK1oTzrmotsHMOHvAimJ/bEqEd9x5PoRmrMHxL5nnUSMudqMwZBeZGnY4kK7p8/FzqKw5xJTsGC5qx2NMAg/RurqBeuGMCST8nPreBx8d8tv8ANSeJcPn9kkBssqJbzSpF78vOuHvMvrPYWnkd7m4XCCVH7RSOLau6Iy42FvNQN/yrhrBkqUnh7DjHLxhQtTSX+LqdbjxXYbKdIDFCgBc+Z2qK8xOtowkwXQUX1EJ5H2VGjlpt12KyGkvFsZbCmYoniyIQhEuMBe31k38J3qJKxV2eLGGZ6OOp2R8AVUHY7sfQDinAkxU6ov0z8t6Z4eHNTSv3rc7m/wD1puN2k+j4h2++P9vLGtSO7H7OHFOBKoqS4L721PLeoivlVSo0F5x1lnTH0goWJ6+KoPC0yx/QXNRJcbyQvnspPXnUNfa8+yOvu+rCctT2Dlb+S3ca3+sNjV2Hgr2Krvx1fZvVv2/RsrV9lelKWx8TV1J1Ff2qsBb5rscjiUdt7IJwUuxueVIgvz2ESHPC2V7+ypUcS0oVEd0l5dTsP9TapBcmNJ7LbWurwX5Xr5NPEY/auWlmL38vf7KlrhyGJEmKLqZz5d6xvTpkT2UBlQQu6uSj099PcZzS42lvNvvbOHpv7aiq4nxKCh+SMgG1907+2k8Oc4gwmSvk0V71KZjy47kmK2pamy5a1vM1IhcSfjRQhthTai54ysEn7BbnXEGZSmmWIQaOqpVvEL12iDJQ83e10nr/ADT0jSFe8V+7pHu2rksf81eJz419M/bXqb+816Nhsf8AL89/tGW2EFXEEtiObjfFAH2b1KDjEqRFmutuHRlpbSmwSO8CL9Olcc4c5GGhxBWuzIDg2XikAW57FN6jypaUDt7ge4onPwlteTYHn5U5wTsTeiud2vt2qOWpn4eeXSuMwUMp150t11HeG6Su4391dgbgKkGLILsWSzIS273r9435nexvzp3h7+m5PciYKx2SV2qU6GJUmPPaabWhmUlrHEWIVlzHuoIQhZjIlR3WsXkpQG0lN8hbJS9jXEo8WJoRJDL401PpWhbquSkdUdb3riAY4UzITPhMxM1PAaZCCCT/AGd6kttKuQYamyHMS5pJ3F+lOvjh0jWlSUa3aZaVqwtbPu7fZ/5lv//EACwQAQACAgIABQIHAQEBAQAAAAEAESExQVEgYXGBkcHwEDBAUKHR8bHhgGD/2gAIAQEAAT8h/wDgi/wv/wDIXKAiL9ZWWbUVL768WKt3jyi1wRwHmXaEQ6Wa4ln2RrahZxAFZF2FXeJbHKL35cRedtiBeaEuuKvBi/uUHZw7l9VZWBfpKZYVkWG67gFZ4AZy9RVmFg0Pmw8IkWofDFwVDniBHyD2/KLJiTSjzuZ8PV2HoWELoZV5/wCzlqhx7o4Qk2bHZcKzk7HPrhBv99ysrqiyPTNheh/Ma2yqnBUYCU+6gtvDgaID+ggv6XHqob1Lng9IAlKLefFz8f8AsffOoaIQROy2Hd6VBXDKd5mMrnU1aO19V3cvcyFapUXPy+svk0L/AGYzAbFWdXcXmXPggQ9NzIc4pdYgIXaD0SxY98cx5QI4clzO7ucGgL7/AH3amgGWA09CMkGpN3QqCANbquVIXN0V8QJOanSUzxbNM+RwX/CWjVYa7mE+0vhEQEdjLE7gUoi5Y1UyRUqp9xnnlIVjYedVr0n0YvlG/TOk9ogKTAFPLJg3AUTuplgoO0G0ZI9miWCvI3+0ExJhXOyj+Z/K1Y4V6Yn9Zk/3/wCAqzZ6IZUfKlMD5limIZ6h8Mv8snC5soSLkfFDQsD9oqNXxt4gHWoUVF5GRV9RgfRRKGAoyr0ofKc6uoMFzJkAVbAEudWCs6UaLJphWpSo4bGKbh2Nn/e2HZo7I5jUdpitMjNWq4mgAwMeGW6W5oUyR6g2wFo0MtB0as+fdYPOUlqwWIC+JbqBk0+7JVd3WSwGo2VW0wihbTs0zGjYT6qxfLGrzB+5UAiWUAAWqxbNI2Fn4PdU3v3HoqdgJQtwSMcksG4Vwq/SBrFyQvTfkdxemZqqBBHFtKrMsJU9WdtpHBeGNOHcLMMF3VKMwmghK9MsB5HuA2/CohYbO7Q5i4Ry2gFs4boxzKaB+i6RZ5fEwdsbjPWsTdjxSQQtK5SCBeniEazHo/kZyhn9bYblvT+TB6sQbJ6sIlJytvgGypPA84b5uK2fxLwgdgv9eFoov3DK9HRz/wCYIzyFWfk3VoC9KDg01l6wi0S1SqWcqfwmtFpDCF84OxHMXtSwxT5lTlMTVIpUkvI1cuuawcwyaqmL85mJ7IB8OHnC5pvK/wCGcfOHWtPuRR1AbHyzMJnMXobnYpg+VTPrsgsBTIMNlwAAkSkAPaveWMXvoEPb89Mo/Vo7eW7hgCgC5Vsp5LM6gOI/9qR/tBLS6bQiqxHhEQlzxkaqxZqvVuKIHbSY6g4BduIuXSDu2GiJeM/MUOy4/E1uVVUrSTINcpefklcSse9Mku86wW1DZIZ4wrWRRgrWY7JhVMv1Dsqx3J9lhNed/wDcaQyRW3ZgqNjrFQCqgBFGTdLVXfNRVbuhw/ZaxszlzCsBkmAuLLdbuF+twE4g+gR2w14NjUQf+Qn2p9J9qfSfan0n2p9J9qfSfan0n2p9J9qfSfan0n2p9J9qfSfan0n2p9J9qfSfan0n2p9J9qfSfan0n2p9J9qfSfan0n2p9J9ifSOV4MWv8R5TfzT1azPt/wBE8393lGq4PWfL8dyVei5yit+3dwmjYwYPV4g3nddKrXjuT77L1IyATv8AiZfjH02jAVr2Z6lcSrm63TMknyT9C8xCMrDClZu+zibHWBlRwXdJ8ximCLj7Lyx5BzF6gMjhXzvWfSHyCnyUdf8AUNKLS2l0usmfJhIaQ4bS3TxMvrWp69/yl9W7EaTeFs+YzMRIBw1zEB/WjcBZzVzWPdo4usrus1FjvYhtHLRfvG0OaOSrywXi+55lfkOIecMZccxCAgJa6MrtmXPD3cbY/QUdSjqUdSjqUdSjqUdSjqUdSjqUdSjqUdSjqUdSjqUdSjqUdSjqUdSjqNC2o+gWNnodxLuMlrLe/wALYOaOq58FEWbC+hlyEPR5TFt0LLviOA/IL8NVseMr6qJ6stGQYJR6KTieZ1dPSX3B4czHs2hiCt9k9nKIJMVfeF1Wpg8gkErVXFU9axAGH8V8kB01RuXmMDLfZ1HBai0Qc3I8rZIwEIats/cNQEdJF4HJhawUyiWqPN6anHHXcfIQIp3NGsk2YVtzjpFNlZJqDB38z9Wldl61DPU2EkScuOKYrHVbBRBjvO+OYKeiGHypNWPMmGQblgz4EwFayQ/zIETZ5q3b9lVKAZVjqOjn9Hl+UqKVM2p/mv7jXj+gPyWnjqVKlSpUqVKlEqVKlSpUqVKlH7IgWsatcR8uvTw00tygyW7PrTCfwQ41cbueLEet78pkeVZLuvLb5RoCkueay8EPaZLtMQNHR5v6nCGThUdyC65yuD1j6qvZ0mFHUawK1T0TU7MjvUx3LbZ1NUeb/BEQrZTo7jjcYMn4afvy7OMHB4RukNKtETRr2j6Gj/2baltONHHrMIlyMuouXP0syUQSrKQjyq0X5TVYAKiZs7YuVaxXCNf9iVqSu1/tEE2+dw6HXOpnRwtC08ylObU42ipaOBWiy0+0UToDJhy3z6S0S0ItoaQpw4smLVleZRBjSVHFP4afvtYD727j1CLTy/obXavv4tP3wCpQZYQ10/l37/lJczyEYecnmJ5yebDuQTxafvlV/wAE5/kiR8MvfcmV5vCKa8I0/e2UbZfbPG4LYjg8W5g6C8DxALFKd2FT3eQdef48Q9IgWfhp47i/ixBLg3+UtfsdUNCnqcHjUC2Jt4jk29OrmKQmjryjOxOVdKNDm/2ea4C9M+IayQB5zTxmBhQ4acxwi2Gxdyxvh5NFHvA36UkOLdAV/eHWxJcl0VGcYix6EIo7kzUYS4RqFdMilkqaAnlB+1BaZ1Nd9We4zfXMI61DI80a+EHeOLBdeyGeyCwHbqVZeq9W6YjptyM+Ib1xPmNZYdnmbh+vpN2L2/3xayyx+RuqPMPRKxUaN+E6tvDrx+QY1FWvxorLvWHMffImjSriu+5mRt5dLQiKsiqjkHU/i4CtgMKVvY8XOzxu7a7jbkim/I31MvjWoc8xlQsyfGIRtHAHnAut6t1f9yh93oBo0RoESdI5BMc9QLwbqbM3KLM6jr3XLtqPI+NtmXiXC0marxzECkwCj5O5qLgIr5m4a/X3Fse87+visaOPysUXCf5T2/J0/IqGTEpxKSpUxx+FG2VEmGVAleAMOKG9hJatAEAPnW4al/rvN1nxjwuvM+ALQ7j7FW+quq+ZxLd0wZti+KnrBH+9lUpmWum7nGax3ELbGrf4Tcg4KYhl8MN2f+zZ3JdvaUN1Ft+HpBMGz2YrcqEFVWA6eYmED1bb2hhyyH4zTx41nLnAgum8oRpTBnK8gHS3zUdepFCKVqqou4aYNAQ4UDA2JmOysKswjgmq03NHxs9C4FGWIei9rbUJxcOJi4syywyr/wCssWky2aE1RjyEv34rm3gG2M6EdQiq1Q8tBiH8N6QEy7N1miBW2HpFVNVapdxE3NKemVkc3NDIiAAUUpoX0RjLxW5FVm7lDHAaTlFQOMFxWRe/l5kVCmF3Br5PbENcj8Ij1kFNUfNWbJNsIBlFwW01AYXdpUeyzPkl2IlnES1Vo3OyS0cIc3MDgjHAp0bowxK0trpUEIDtzTK4NJf6lwLPPYfz4Xa8GAemZ7GtOmn4cy0ZRlR6hqUmUKoSjrOHMsddwGVlPMgxowvF0PiHY2jEsoO2uoRRwD/6DAF7dTgb1wzEuCUMjSc0+UFUJuY99DlqPkz9uBG+8XN/xRZZxlzglizWs/EOzZi5Bxna/wAdPG9OUKlHsohyyLqOcOCmMztt4cbZkRAhWvYrdasGrjXfDa0F3d0VrcMwM3yAgaaBm83vE9Ws2MUVg0idEPXAivaqDN6y7lRpTtQHYqWRbzMpxVM8J5kVhgjgUZ7xKe5LLoaDVtNWWw8zZT5HXeSmlIBYve27+FtR/rjl2X8ixMUOzGj2spfaiPGSWFBby3k5svcy14HnKhNzJsGXyo95WNbvbS6BmdHlWvR+T0WHyYXJCvJov0IhmG2eePOjmZ+xq/6wasprE7Aa52/zJqumPIeiqlkAQ4mdS7yvqbjcKmxAIiNNAUqwLhg/JwWXItfE+2PpPtj6T7Y+k+2PpPtj6T7Y+k+2PpPtj6T7Y+k+2PpPtj6T7Y+k+2PpPtj6T7Y+ktOr7MRLb1w/1P8AHf6n+O/1P8d/qUcfG/1P8t/qf5b/AFP8t/qf5b/U/wAt/qf5b/UHwbavy1Sy5oY8atqtfx08Z6vBlsk41Y8zmNbTFFLdTNDyRs75eFROKbyhM+aAvbk1ieXBFo7+7TBXeC8JmIbdfjBPW0blyyEUOg0lfRc1HIHmxMoFgM0zSD7XG/8Auou/TOoxklgrQq6N+ozAIxI6s0tomP6mKTc70w+DOSWWEp5UIJYoqufOGD9wM4Hl8pVx98sYAWaN6Mymy3oEZ4YOJF5ou+VWv6mBhRRN0nIXUTixloaRMhDH/ISoVkyxEPGtlVFJs9LLqUboMloAyyKXpd8rtMKw69OyXFrsHVaqUvnxcZXmNLIIo5fpMO+qaKGqcimEwlxMe1UwiPn1VNVhaKz5qKN/CIWxSmHjVKlSpUqVKlSpUqVKlQZS4L0z+Zb3Le5b3GoLlvct7lvct7lvct7mur6/Krw6eNjr0F8CxQLfPAARfWIcQ3WJG6WpXYymsx3QUb+YTRl2tSNoZPChmF0I1OnDJVbzcS4IWYYOGhuqe4u1q7dgvaPQ9oc97fAF91Avu8l7l5YfECOvBCTfRDg9cxUTIKBqrDUvuWy6umBJzbSE26ryS57oMBeWJSr1mvyWLP8AaNaFs6rJQrnvUZoqUkHI71tecuZ1E2pvzQGXLOWIRKopsqim+iM6hY0CXptmZmIVU3c23yNeczw+l42VbbqWGcsFiGgIIiqimGe4ZPo2xUXnj8QhEGdK/EvRCzF0rBpwSBtXGoXGhIncDQq1vUru4NyYa7GNHtw18qZfJKZCmHXCwi01XNw6i7khFK4VfIq8fp/uw3+qtPGNVXpKLjvWa1zKC/7Gs1pmoB9+alXZ1nfEEROw1O8mXylblKVG6HdN1MfI4VXwvG8WfMtauuF6s3u+J0Vtjz3RhgWoCdfa9VFWitD6x2ZPmBHY98VAbOOpYO3aCrk7thrFdwzTSOPmj8JyAOAxLb6wjDTyCFIddIGo6mGwX8p8kvHV3y1ZDRfTmHHOlQx26yZ849TAsQ1SzUxgXoOZYjRtq9TlX6+rcMHueDd+Zj3CYraEM5NCXp8T+OnjM7GnMTvietwSmtdisLnfihqr/MA32BdxqNEBIl30ylXzLj4Lxta2+4b1KDJlKH4tX3otTPxNC7rerpMwGw9+MCsd9wGRjicBgNS12rLb/Ez/ABGvWqRFYavzD7zHHPCDyBFssX76VFXd5TEzpjzhT7bvUCA+9IdyhyYeldCCMjNjIGlYmYoMoENkGVGBwB1Bq9ePA8Z35mUKozveMbD2BFbfMbzqnBwesF8QgqcrbNcYzcviBX4IbYYW1brUAD0IKnByfrsZ7X7f74Nn5d7tF97qIK5QweXxAinUo2d/k6eOpUolJg7hQ0Bb20B7SiVKlSpX4KNSiJGNXCCmnizEpKlSpSVKSv11brAPTnwbvCeJSyrAhrLZa7fpH8Bq5DHs/J0/ewmtCmz5+r84eoo5nokcxXrHkMMRVpfBUcq9/kafvif44D8Tp8B+gfw0/fPJaHp4ZcIQPP8AA34B4sthEMNKCrS3AOsnlEgzr/sUuMTImxWGslDqKWw84Bfx4n8NPHZ347O/FV5dRarZZ+0LfpQ/j8Rr8R4hNVuBjUrh+KGGl7nBe8VfOc4uAbRzL1VGsW2+J/DTxixTgI76i0Fch8pbYhKK90SpSuF12XE15GebgnzcvKaZWfeJblaf/WAUK69fRE+TjqLlvqLAZXnvFN5ka2484jYCxtPrDaVALPg3HrlLU1m5iE5HDwlrmarY5e8P2U4w6DyRTVcnlde34WFmz8hDUIOHL+oY2u4FG6cy+vZE/wDcqWAY9mSruoFGjmjTOfKYIpHqENwTcBCdLXn49PHjQzke0y9SS6meUTU46ZQ+WcKc0PzCuiod/IjIBiB0LzZLBbSTF+qhSYtqVqu4w5m/ztT15UDg5V1tgNraezuPAWGzYxHCdW0bJQmtLt/xCrFquc0wnW/7cOIfsxp7zzdkp2angdn4UPl46HKgIpl2+c4H7BLsu9PpFFm9Mc2AZKU5sk1uttVnGiYcZAGWk+MxCQlwVgP5/Hp48TEpBxbK8myYmitt6RQRbVtxQLUAgnSoqe5MTExGi2ghIWWJYkREEciTuV0unpjACcTBC9r2rigpANwCz2ixPwzS4LVFv7J/xLh/qfxcsnZEBURGvzPPxj5njBE2dShXBTa9tjErKWOj/QjD5D+gAegNwnXCb7kjOtA54lf8Khip3xhq6amkXFGSLaELnidg7+0N1Zy94xDPS9spyu3cVG2DPFrby7u0KaLiN7L2+cCASRkZjwBBjhtN1qnSgQl51QjN/mGCmBySUBqMFY+TmC4ifrQGDAQpuMgbjRECW9LhaUhqpFycbh3LviBo7MGlODyg94MtAYPHAe4h9U5zgFzSjd02Stz87S9iZBQxH/pL8QMpeo8NSteS2ctzNKxun82/0y6odG1M9PCIUKijZ+O+FZk/nV5Zp49NDrZnTvfTNRu09Qm0vTs1mFZONtxXLyulkXAd7GkE+lSZF6wXQu+EDzkK8qtl95n8md0LNFtF4gZM6N9ZwOXPFuaaaOgXcrMcxs63OCEzvggP0bd6EA62Uf8AbmE+AHe6x7Vo9MyJwA+fxQNShOxb8hARozthpfNQZe+5pIWaDbgImGCw0hFc5pBHZxA4LC6fVrMNgHHzJUNjJusxcrmrBr6FOEgqOZIfVr+N/lYadh8QX6fhw4cOHDhw4cOHDhw4cOHDhw4cEr7yJHIqfuTHnu/GTtjcxVLYOn8u4DoQJEdn1e3cOE5Myvjxai2EKNC0k0YuWaKkqbrBQssmfiX7lkyKOBSWooZTECCz09op5uohLSIUBl7ziosR1SEur8ns84WWZXFpTJFSCF4Ya0+yvy7OocKM7dUooWWTNRdkI8wOCdVNViKynGqGrEMuA2y/STm+PKmtObKnAdEMViitIQhJcUSGSzi9z+6P8xGPxAPhHNVgurKqt+UebF95WtwX6YlIy/4xwB5KEKSGELy83Yv7PUeiN8m4rSNAilJep7KcQqArh25hcCGNEOgtMKtqCNWCHRVaRQEU1DvwnYVcvPrsiFAntI4FNnd4mdGRCxlVjQ4f2O4flDfr3LPEcXHmQIRNn5abwnfmHge8rCeVx/uAhAaCV474zRSBZ6EOHyqL7vtDB4JWsHF6hF4LGkvVf8QB+gNKhLkbMZxxDzcfOT0OK6puClSNxBAovOyVAE1bhS7BrrBH208gAsvs9kwi54G6FzVFHF3UDjsg0m3X9ZVfVhqjJKDkbhQVGgpKd2vvFQjggmbTxokGrT5anPZsWQGRBnnqN+Iq5CjOdr3MZ+GzRY7JaS4iCrlZcFzgOpn126F1j3a/uRaJ1WyvfRwxfFwXcE2pk6RjX6Blv7WauAGrPB1HbJVi+LiRWjOhzbpatedwWIgRb3ZT17CApLFAV7NAtx+yMvQDiWnsh/kmqPni/iLWw9OJQ4/C/wAKXE9qJBYdYfMonp1/8JWOLnX41DBgaD8rXczRAQnFifMqiIBDXTyvjviBevdoRJPKv1QIK1z6RcSRE0XdfB6om04MqAqapYzfb0az2s1uKDCdkCyC+mZnt+kJQJihxbzFX0BN10V28G2VaydNGdlVi+rnE3N2cWtD3ZmB+dJN5cTKFjv0Nj0+T+51Da9A2b77lxNV6SP8x/U2Eub+fZ8koLlBg/NZJ6Ltkeh5mbmrsQXim4/whIDN8EdTkNalNywL6Ams64IgV52Y6PT9Nc8QtmpyqleDT2muORbZGI20g3lnECLt5VoM+hD0EDsGA2bHLLiNUUl5jygWtVXpLS8mgLazKigtwcwEH6llxy2zrLRRKSdoYJiN70pupiTs0YFYaHqag/8A0r//2gAMAwEAAgADAAAAEJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIAAkABBBAhJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHhn6OQ+qRYwi5JJJJJJJJJJJJJJJJJJJJJJJJJJJJJIYAd5B/ct0Dk+5JJJJJJJJJJJJJJJJJJJJJJJJJJJJJKLWef46WZr42xIBJJJJJJJJJJJJJJJJA2/wBrmICSSSSabJysAQtJVCovkK0SSSSSSSSSSSSSSQu2ux22cWSSSTZZoRYgshvPJxAvh2SKSSSSSSSSSSSiQiUdM22leSSSGx97SgX4gqAAAAACSSEkkkkkkkkkl0L82kKy220KSST+oL5GAHGO6SSSSSSSSSSSSSSSSSQA2202pq2220ySSSb7SSaSSSySSSSSSSSSSSSSSSSSSM2zR7/B+fpKmSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQWW0YoTY4t960ySSSSSSSSSSSSSSSSSSSSSSSSSSSSSM22222/eyu22mSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS22221BjHDy20ySSSSSSSSSSSSSSSSSSSSSSSSSSSSTW222p20k21FWmSSSSSSSSSSSSSSSSSSSSSSSSSSSSRW220i20yNW3zUySSSKAySBSSSiSSSSSSSSSSSSSSSSOW22O221ZC22uGSSRbKS2LIKZPIySSSSSSSSSSSSSST220u222zo222hSSScRZO0dHoeeGSSSSSSSSSSSSSSQK23W2220k2222mSSQ/kivne8YABrSSSSSSSSSSSSSSR226W3lsSlIR20ySSKYrmnv3gMi9gcmSSSSSSSSSSSSW23W3TGJrlbZ2mSSShzgddXiQmEdY+iSSSf/AP8A/wD/AP8A+02+kkkDdSdLU7TJJJ+vlrB6iWcTsruOdJJN/wD/AP8A/wD/AP4JHttvd+2njFtpkkkZ+mb/AGLIAFB5ahDpJJJJJJJJJIBbTbbb7/8A/wB/VtMkkhz731bCDVUrQAAAEkkkkkkkkkkBt4ttn/8Az5v9RaZJJAbp0tV0nO8Z/JJJJJJJJJJJJJINbvbbf/8A7n/+mUySSTauaqbaSS6RCSSSSSSSSSSSSSSK3G29b/8AhD//APqZJJJJJJJJJJJJJJJJJJJJJJJJJJJJPLDbf/8A/wD8X/8AxTJJJJJJJJJJJJJJJJJJJJJJJJJJJJIBbba//wDyf/8A/wCaZJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ9dLR//ANIJf/8ANMkkiCAECAAoAEkkkkkkkkkkkkkkkkkHslr/AP8Au3X/AP6pkkkgllQi1ErNkkkkkkkkkkkkkkkkkkmjtM/z9C//APxTJJJnpAuXgWlJJJJJJJJJJJJJJJJJJINobZ/oODHv76ZJJMBMMNNEV7AIBJJJJJJJJJJJJJJJJH5b9/8A+fy/m9ySSe6w7lp0eplmGSSSSSTAAAAAAAAAAARSYf8A/wD/AP8AvjkkkicaAFbXKX72skkkkkkkkkkkkkkkkkRP2/8A/wD/ANfo8kkl80lWFx93al1qckkkkkkkkkkkkkkkgGnlu/3+LnIkkkJwZZSZZX6BlYQkkkkkkkkkkkkkkkkkggYGd+zUkkkkm+37/nGkkgEkkkkkkkkkkkkkkkkkkkkkiMtmdkkkkkktqnWtQz0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkn//EACwRAQACAQMBCAICAwEBAAAAAAEAESExQWFRECBxgZGhsdHB8DBQQOHxYID/2gAIAQMBAT8Q/wDlqqxGctZtS9MBVlrYYggNUxI1MIkdJq4EU1gLrsDJSW3JmVAunZJNYAsgVqV/vrANpmx3hLeMQIZlB1YmAWVcItqRb8aOkJAQKa94GqgqnZaNDdNYU3SsfCF3WVOqoMk1BRX97i+yglEolFVKGUShlHZRKJQxDVlEqPSpTZKNZUolEQ690b/o6RqxFtOzvvPFKJzwLWA3g2/8mgNW30+9oNNzo5rEvfb2M/VeMqVVXbWE9aB4gSOsQqeCNzC/n6lUT/Rn6hYcL9Z857/7lBJ0Q8b/AF9Gaw6tef6TAvx9o66GH2JtDQWu9eywFu9RqoIg6s0Jol/MQG+CrhXR+8wCjjrLpRxgfXEWrNzPlV3HVdaL9rmZOgPqD8MVudDXjFy6Fdi/eoqX/niRTLe5QM6ym5KYO6PRLWmDf8NquwRWHXXm3BZevthr1l5EF5NXWKGtdvjHUbN+1SqOv4qWeBXz9zINcP31hQ6gqJBIToHv+3B4Rv5+5kcl+8T9OKmGShnqPoV+Zds3tBQbivqwop0t5hfiAMcRLLfaAUdPfqR3OgemZdE3+BPzDkG4F+VSluSn0r4ImQ2U+lYiWDqV73MiiHPcOlVweyzh/pzOH+nM4f6czh/pzOH+nM4f6czh/pzOH+nM4f6czh/pzOH+nM4f6czh/pzOH+nM4f6czh/pzOH+nM4f6czh/pzOH+nM4f6czh/pzBtB+nMKsDFsube7LrKbAd1pq0UvjPlDsCBG4CtEtL74tEN1/gRg7ywaiVliVda0vpM0bo5VbFzHcGw6j8wygbyyhm9TrxMLUFi4+BmjmOEutROsYbD61jhmZKwZX+BbLZbLZbLZbLZbLZbLZbLZbLZbLZbLZbLZXglF3KJTpKdIPc9Q4p261wY7jrTNhMTVj+ADvtk6Cet/cbHTv4qLN0R52/c2A1q8xLtHh50x6Nyedv3Ksc3XliGS6F36jCPYCe8OJ2KZotqFvFqv9zPjQedvtMkTpn1iw9AHGD6iOoTc7o+V/UKdAr4jf3F3uQff70h0dnpip4CK9A/pXGZdg/iBt9gq4/xtNP46zf8ATM0R3cqJbspV1KzXEcFwVV1qAspC2Cxc0HrKYjoRRpMNYlf+A2Xeq1GzNFdUi9esU26RQ5Ir8aYVyl0j0WahhgPGZXW1RAjzBqzmasxX/f1I5z/H49mekC4tTGzLT/wS1Ln8INXWJjMvQyy5XrzElJqCnI9YDopqtodr0Ji8HmIN5f8AgQD+CrlrbgJgVXQdzG8rxRjbtS9ZkKpQFT12ggNB/v3b33qUEXW+RmDTuklLdTvcybiq1zAZKDN73L7mpUqw30T2v7n81/yLX9G6t30CUTZa0Nu8H5pCwrWdIt3eUoATQu4QbG3evbTOmhr/AAWenwFiKGkHixoW2udoewwuKEdVRHhpOOVYp0oNm5E9bcdZdBtXudZdDgKbQXppiO7YiveXP13RHgYaTe4QqWl7y8IKPB18IyYWa6Q/oSaa3zMMtAlbw1ndN4YobIf57orvJUoJpYNjv1BooGt63NDlVd1HZYcY1uaad8/qEApB38e+jJi58wIJvU85eQaGNsaQIVTkHDe0OGbWVv8AvMS+Ac+ICyOTGJkZfDmLoOTNeMxHquND6XL5K51irwRVEwdNlOrQM1A3mFrrU1bhqwQFXhGgOX7hnazo8YU6tY3UXTDXF+EKqwxYA9tf89jHDu8T9Wn+Kh+hAor+E79VGcSiVevZk07a69tddJmcdtE1i5mmXEx0DRX9LYl0PLub1AdxvT6nQEvBHClNcaQQC3a8U1LMsqLp06dYhcr2Ky+WsVRpIynLBTBdCnM3VfSm6g2b14SyCrbFdI2t30qL0U89p3xZZpXo9f3EQYbV70/mZx0KfKiJkdLfSUT4n0Irs0C2DE9VeRMFd8zKOmzpX+qj1EoPtM+omzrV/P1MjsT4+0ZbeqvzQ/MueQeNXFSx1FPS5VGeqekXVBA6kPX/AHD9rGh4Vd+lesQFGxV51cMUapfun4YhLWq9/szzBr2X8RUT1VBTHS/KDYPX/JYttvc2uUhoweXcENYVGVLzsPjWB1A0MqF8pM4Uq85qiddc51g4xTfNvvAPMB52EqBW3FvCt7Z0xKxY0Vi/zBzCYs30q/JmPGpuW9bbrwhKjRYXrey50la5hL4WQZ6Grx0gNVbeW9Tpb6EzZxStdM63m/HtO/gompe9e0dXmZOeffWGNJ0YkBtfvDHgVLqq2/5BiNJoDpHJBa/N7fUCh3r2R/EVsO7fhAtytKwnN+sSyolDriAYm0AT12fErAdNI2sd6vyr6muGVrzMgvXSGP4bQOpj8s5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5Pqfc5PqfcsXL1+0/wCx9p/2PtP+x9oqI6aw6kl/0pf9KX/Sl/0pf9KVypGw7jKeC7eyypfr0Ar6AszHmT8qgpb+jxhVs8EfhloLyHySztRspiNlvad8LHVFlxHRyT0v6igt9a/MCGSy/n6g0FvmFXN2oG/n7Q6JsPWEJkS/n6jA5/1c3qaA1beRX3AWNItI6Y96l5SbhFpDriBbTcfYmQHe/aDVnj5Muzoi0L0iWphm/B9iOW9aWNjOwRao4a7ybEqVKlSpUqVKlSpUqVKlSjecE4INtBD8Y9KcR6TiPScR6TiPScR6S8+aFU3hrFlmtJcXXA1TQ8+vGsDER2uvSZfXylQzwB8fmXLZbKthyDBVtd9Pnog7gfEPg8TExr3TvrkTaDkc38ytD1v1x+ZS3dLKZ2x8/cCnAD0lL0jfz9x5c09RPzM67IIBuFSmjQr5+4/GHuB9yrBaZ9ypYTi/evqGFsgFbrZBryvaBQ6XNK9m/Sz8woBoBvzlwXQv3K+IqBwHpB7UeDoD3H8RkJsE8oZBoj7weeHrHY9ae1R7ugehUzsf44pHbnaYToV3787saPE6e5hlMYAo9P4EBTkhwTfJXg9H2YvQGEcI7idw76Ig79mFeFywigKxOsXNTeoOyXKdSWAN79q+4dHZiazCTdIFlwR0llXHH+eaXaay/c90M5hh6KkbvUOm7ABR3QoLsXsbsLTPVhhOp3V1QLTpNnhs7zOqV2nfueAnnmvmBobmvpXzMSuPygTvT5V/pNC9D4hdt9A86+4MjRkfMqXHQB6a+v1BelAa2i82dPSGb2uXnUCl4nh/wwaMNa9WowsNvWIiLbqeUGSNFK8Ap9XMdRyfavSUXiPQPuJQTqX0+4fJ7G3pMOFVAsrWDdv+cM32ms913HEGt1ym1vl0gAKAA6B3RHCJV9ArYL/WBa01k1z0vvEKSeA/S/G469h/FUrN9tdhjuuSvPtrf+jN27TWULnuOCUh1ldTY/PnFvu2zcBfpmK/hZe9aEOLRo6obeMCinu6bZxw7Pkwy6RHxGnsP7tLIKa7OZdcl9zceh5Xn2mn2APIDvUUvYbkOvtCRVWQ69SNRsRum7xgoHdqCNoJ59PcX4vYf3jXfYTKfJ3AFsegY+e9TtKf4QCa23sPz2H95YRK7KI1Mx7QS/sjvLBTjJyhMaqLStNWOHTeEJY0FemGwpydSFkCgSlrKFKhnPSG+AHDZT5GneK3p8l2HfM6Suy+4417RvSX2NIVrp2X/T1ZOxyU6Mp/TU8Hto+l/D+L7yZkHprE20iWrw6gGC5bKiqXAfONpZoKC2Ck0evvGoSSrW8fXe6uq+h/vsO/oLw3QxGMYyYvxix4rALHixKb3Sha9KOY51XUUHwgiu+RXmDzNVlVADDb8EAfHQFvi8QNRRQGU8OsunBpBTnELNoorV3voaRZZQoDNpvx0mdKbauyuY1IiiVbrtCsA7HjeZDVTYZfqBX9Kl4Yaa7KAep4S77L7aAD4f7Ime4HzAT5V9xXZjVBS2ltrg64tq6cna6q/bmF7sNTTV3VeNy0kEMHfA1zsxNO7LGmjouAaqrRpqzUvjeVWO24RLuvj/oHYd/Kxy0jdWwU3qYLYCi/Mi7BY0bmBZotDFUGdYOrbplawkrvFlmdYRVcSx+ktLB1j3Yg8DwTMZhuqNTEdyqR8ZeMDZ0RimzYuuILMgpxn7l+8i38usCrI6MT6a/07YgVTEstox8LcOy0yamnEBTkVwGPdnuZuQGreug9Ii8CtuFAYqr03hoCCFW6Nguj0uVhkHyYO8H5NpQ5i8tj+ITLLpOgvwesde1s9AWvBl9pkrDJ4MD07Dv89w1rGSJTa7Cay77DiBsQqaMJ7QjVQWoBfjUOJf8ATxphire04Y6145IDmmvhX8PeVXbVzauy+xzrDBXczftPG/zdDzmmkEgMsImffYL2DTw3iydPkfZisO1PsRATsDXNR5U0s+h+1Ha0KuYtWt45r/coivRfZm074ej4zME/S4CPJ7syNN0rkgvZNPW2/aGBzfs1C2GwfBOHUlBTee6H5JpVw9rgB9C31YNNukVXdLY8o3XxfvULNf0e4lzMSYHZ6SitQEtI2JqPEDNjoda+Dv0Ywchq/wAbi9A3Ww5Y3mTBsGwcH+4SC2EGZe0W9e+7GdSOdZm7lZudCWVNZgomThpKxXj7zDR0qVpxpDCJs355+5WKiLedce1RzHQ83t9RNnW784LRxKXiOSu5XlHNXsV73ADf8tpk5T1R/wAds2bNmzZs2bNmzZs2bNmzZs2bNgqTIOMG15xqiyL9REECtw2tzFqYQQOunzDc8NNH+JdVPVdgN1/7NGV3F1Xqu76TIMsAvXr+ojrAnfdeqOTYKv1qUsug0scXezUBl9a9l+ILL1KfMscYzKWps1foishtC3OjTNKveOqhm68IGh1ajuBvjzgNDFHtcTozd/j7hsdT8xtrrn2XEWiul+N9P3WFadGvNl2oQtq2gsnTEqhdGveo2g2jSt2D6L/RgwHAsjS1ujpLM0sTCecMLgLHwbPJZwQcF9FWe3ecFrRzpGnR8sHl/AL4S1DQBoODbx33lHgOm8wCE3Uqv4ENNce0rCG7b638xy+iv3uI6pD7MQbyvzqviWybt+cDjeqMW1Vqvzu/mPLlt9bjH0q/e5qi7SunW4KJ0/19Q0Da3z9zPTRWelQUPL3r6iqzrcFBWl+8SiefhqHrL9RYyi+VYrDw/H1Gu+bjl5I+9wUlvn3uWLet+1f0owpIR6zVFe3pLPFw48xwzBsG5afSz2mP8tPgkQZ9T9zVF8B8swNrq79ivmXg9+o/Q6wE8oYPuC0QgD+PSLi4IPq/L9ItFsDUei+gsG4ZGy44LgWIGx1F/MwQ6l+6fiXt/aUOsW1JbqTjgWhANJSaafyratqr2fzEunAe2Y1k0qn3PhlzscleQ+CE2DWpihuV8PuCCmRpjQrzLAGoVDmenvLx8V+kxDs+5sDh52fiOrTPz/8AS3//xAAsEQEAAgECAwkAAgMBAQAAAAABABEhMUFRYZEQIHGBobHB0fAwUEDh8WCA/9oACAECAQE/EP8A4JuXv2X/AArX/hcA6QjgdkxYmQKlAxI2mUDZCJmQaQyhEKwBbpFLTZISWMyjnIigReqYLg3SI6YsXL/31UW8aq2RKPCFRXCaeKoAsAaF2hQOsPRhqRhLZAuPOLoI7HCRk5YodI0qJYacZvfeXLaXFQQuK2/727INYJrOCW6y8y0ly0xLey3WXWJdYljEGcodrgtEFrWXipbLXEEaP9PcFom6hvQGGwSkui82UWaRLU/kY2XBR5v4vxlBtisMpsK36v8AmfCZrZUugb6c/wBUao4xZ4RhcIWh11HmnxHU2NeLj7nH/wBlh8yx46dIZ8Ben+s+UvwbT0/HWEGmxfliI2NjfxgqOrZ4tsvCRVoNr8rqIATIl3ylItletwUW418i+szRW7Xnr7QBbw/EKuLhLtNV2dC2Uo3hx56VByLUeN1GfS9fqFLOVr1SaoN2vOrmRraGf89BawA7VqZKNJRvAu6B1ylZGz+E0W6v70geJPkVBXPHzbL6KQKD5SjGxpG3CFHhLK7getysW33X5jbGRb619RiXpg9PqWSuir1gsP7OPaIv/S6v2uNxjoY+pumzCqcd+q/MpKeFS6VOFdW5iAwVh0QOkVmtRp5KIrWIKw6VnfG8TZ1z66wK8y9Svabjb3B+I6PufNZPKN4ga87+4FcQs8289YYfZv0SDUzXua0ngvxOc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1Oc6P1FtX/HLs0Py+jsQWCkUNmXkl9uiMYUFsqq746oLT+BU2B/e8rFz/SZa4kOsAsVQHeYbMzGtxPUiUK7Ym/FpHBbNK5yqLmGn7WalmZ48B6wzVbwMBrAZ5TBejtr+ksywwUS2Wy2AxI0d+4G4m47BjP8AApvv4huOgFedS/JseDdwUuYfID6jpOLHga/EFbwT5LcuqcG+SEuC2K8ZukJXSMI7o+lfEVFvbyx9R2Oyh4F356VNC+y8iAecCAurZyKD3gsm63nr9zCGoMqK6KPNwPWDC4UHOxH4xDu6vmKr94xVljfzpX1umFtcN9VP6YjL/E9a7IT/AAiXNqlSp49yu9rr/Uax7tYIL5Ro+VwsCyspdTM+FykpaSlLwhdR2gGAWAZSCOn/AIDed1iwGWW4y1U4RThwgQUcIPVBUtalgdOkVVcQgoRmC+M1BxuCROUxHhFAbkFZ/v7MCsfxokslksiVr2UXf/gtdJT/AIdJo6JviGcwdZHKRXLGxQ3Ygl1ZylJqV/4Gy38KliiaRl7lXpKbnMp7bmmZlsiJTT/fOsCZd9JAmqwKO7S9K25RbHvcz1rtK7hB+LjPWB/C47Bv+Eb/AKk0HfJQJo17yDaotavnBXpVSx3bRgdfe2QTQUI9/IArUE0iy+BFkgSKg6a1HM9tLmUQRZmkaPSB5Q9EAlEhRSLoRx1iDZSmfSVAcRh5NXvtMWwa1KKoEv8A1BhAyjgtbzJ4FsFhvZL2Ba1/oDm+8qQCo1/gRm7SOQc8IZBkzLvvmbROBrvkhebuAewjECtH3NHzDVMFRG65dpLFNUaMO16mIZYzZHLbG+swMXlAMBRuxa4R101YUhoGA0iwg8CGI6EcA6TIOK+JS98wYDaFJM602/0Aru1qNvz/ABYozLXX+F767SoZJzZcJprNJq5lsqo8YcSUazWUbTJ2ZhrUOMawU6zTWWf5wod3NuhNMdxxoqMMGd4HYVC20KrfjKDYAVvxm+lcbj1UG3ggSgmLBUQqxmUFsAVm+MFoSoVbvte+m6TPubEbwC/nlPBDHV+pYDVo6/USeQfNPSCxuIHnEI8Rfgv+oqPkPiGo3VfHB82TgQw8rqKqNBqbr0uulX7wUHca9fqBIlIXoL8SpyBfC6mxvDbrUvfaj1MEBOQPWDm2wvjWvpEa6lvO6rqPSHxOXldRQNA16f8AIEjqntb2JiL0t6D5iycA+fCPJeNdI4a/ygoO7W889wLaIETRx4DP+oIxx4FrzhCxhNt2/aOE6gryIoAu+gAS9TsaK4Z15ysoRt1r4g+aOeHGFCLeNa9pVzqDtw5S5NwV45i1E/51mkAaOjK3ri349r37K+EGDsuvOaYbaecKKOXppLNXtnpN2Ai3p6R07huZDzK9bmVWt3HKpvDWCjoev3E2GxOonzDDXCvKOTyGWrbwDppBqDYcGZZneMm1NPW4pTuvzhSxso9fuUjY/tZwo0r0zBXVes1/hwyPg/U5X1+pyvr9TlfX6nK+v1OV9fqcr6/U5X1+pyvr9TlfX6nK+v1OV9fqcr6/U5X1+pyvr9TlfX6nK9H6mHR0fqct0fqct0fqct0fqAwK8H6n/M+k/wCJ9J/xPpP+J9J/xPpP+Z9IExLimC3JLeddgXgh1h4mveYI/LPtA/8AVjVA6J8Q+z8CMvtQdEAMdp7+bOhfpBcHcHqD8wyct+p6ZianAZZnaynSvuatGzUaA2Fml5escLYao7Y84j0o17fcq+Aa9WusWi+EHU7UdbjeqGQeP1GgFpLwvCIgrtnyjV20svzalFDSw6tQyo8Oktspn6hlA3iKHC/KLVLuh1SBZ2WE4W6zY46c4Nl7d6pmZmZmZmZmZmZmZmZmZmZklrvM8ZnjM8ZQrLZbLZbLZbDF6B/avBYHpLobstSPCtjKlPFvszKvUiSyn9whIUXm8nWPluW7+DvM6d174KDo+8oHqFdKD0II+C6K+ogPAHSO3Rmzzr6jag0VTzjSDennMhyr0njNv0lw4qLldW/b6gOOl1L8kaNgR6N+8dOZPS/uLYG9QwRwp9PqFT5+sQt6pX7pPQHqPxGq1LXRuZDNUfIbh3cV6xZHP1l0+ZfMT5gF+66pQagj0r6nn3QXcoORPrcDo4vqr8zGn+PpdpK89+9nAEvOcbDw4vtHTFarr/ALkSgV4u/2IIex0TR7j38CzeorteNely7hSxBExMEsjjWPCU08K85qjUr1v6lhrLlhmWXU0g2DNMTeoUqII6f57vtVcNeB3kZc9XA5cF9u88HzM2bDR17qss/U6eXGbdr3wg8jXKrHoxhfalHnr0xCGxz8sfeJS616X/tGrnHfhZ8SgU0u05Wa6TAu4Tyu+uJVGm166dMQavnGi7ybcqMPXMWlxaPKyIPetHk/aPKcr+YiA97vh5frYBNFaDhmEQZNeq36GJg3gHr7wtW4PVb9pkHAedxUd3qF31xCC7rtePCFm9vuOhf+c8V27z0ndRXywOf+o0pabfHu1nElDVLGtYCBatJr3b57073/ANPau1/gqV2BRR2VDErsqVK7ADZ4eWPoldtdtTn/AJ1FO3eK/C7gWw3S8Hnu94t4mb8BMc41OX4Zd57u8uzzNyC9MWeDnsf7sabgCzsNZS3t3NhQ+2I413PVvvXmtrprLuurczNtVW3SLbfesTV9Gp6YPDsf7xbdtRPGa9qUdUHV+jvXBH+FB8J+Ox/vMxEJ2Ub3NNy+y94jguhdC5lAABjezOvCLE5Ws11C8nnNJaLa1ZRehxi82KmStO86Hj8+x79hjssl33BvSWd2ltV/1FTZe2p8nbZvBPfvIIXKQEpnH7hGiYThiAFQL0NcVAygBeDn3reCB69j39EE2NQjQlo7QcZDWXPSMAcN52lUmrhxKEA38YBnRipd3RoZ3W1Mg9qS9GOjLqymUXCaX6haKJvPPaa7gVymd5AdZZR0qucoVyXY6H9NdZO0Fu6Pbx/pTyzDJfcBaZQdb+peqZyF5fAiw0gXqXXGpagq3OvK4ERuxyOMSq8xV67RBKsApeadO6vILorse+hokqLipqg4S41xpvbgxrbAp4OXxEc0fNguOO/K5ykKhU3iOs8asMjwmoQ2g7QIYya26bwbFWrGcZTXnHawi42jIAhd0jV7zAUYBu3+nErgCyFmkKnc7KMHSccpTwdO4C3yHHK/uERSxis58I7Ai0qivHjcT4GHpUoItHqhhTT2qhIsVkVmtuMrtQsi4lgajPjv69j38OOzWVDR6MPhQTSPOadlHYhqxK1lYlN7JUy+JzF/p7XKAyJWHaIUD4nM/wBTfGndvN9yjuY+3jns++xaLY92x3zY3K+u0AuGfS/qXS3HyywtbVq+VwUjkdU/PLG8FnFbUJyTbmK/UzH4Ul0GxPjgdWvK5Vo/IsdVwepmZF7K+TpUtV9S3sRCzsh1BgK11YkQ2BfYPeCLjpfKr+oeZHrUCziqOVG/jBexKJTV1ec/coZeI9ROL+W/8ZMyEbl+NOwQAQsdSIE5svjyiNiX/GBGd3DivhNME9Xd84oFtIrcZLrAd/gQmj9cClbQp5HpEsqDUxyW0m4430blAPijb4AdILC7NysB8XOWvbrj90lo3+xDQOHyr7sCm/KF4PB6nzApbaryla8/iKpUMANm/OBTfO/Oqjkr+W148EezPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zPw3zA8n7ucfhL88ZeKH53geLf3vLOnMvnlhBJWm7w5Pv/FSO325vKa+Xq+DlLcYmNGoDAjZjvrwMnTWXWHWr9L9oN0GqWeFXAytnoWfcCF0fJ8o6Wzb1IWOcq1xLryMDhxL+ZSlblxdXYgtq4C/G2ILvYuX4gL8pSjkX8QFnQvucxB6QoDBR6hAFE6teFa35Z8JZbiL5ESgXV+rjCN636RVDcX95Zjo5+xcbMt6fJLlU02NjoP6KohD0YnKKFTDcGIGs4tTw4+EVIDZw9O8ZaIkHzHV8CVUrc7vjAxLmtc0kOf4AEsmceOs4LqFele0quAK9D6hd7SHqV8wtBiV0XfvApDZeRr6lBpskpaHYryqoqqmQo8yvaGPAV6VDB2MtbwoOksDg+T5mct/g+pj3qHrcRv5rL4NWV6VGRd69AI21vp4uFPLELwlcOUWN7AdCp1N6g+YauErHCAqjd5EqKo2A6FQoANKet/0wO7MMNjKVapzL6MyL5XJ60xquvHuRuoOh9Rv1JfaZC/yE3E4tXq/URprxjlpYj+MdkG5cAS9uLXn+YN6QcK0UPCxF3pLAbqHVg7BQ8wRdobI6Bn1qK0uNeg/Pp/aVLTSBQDRlmrFt4pFN5rr/AC1D3LvhZ7DAG+CvrZKw6hs63G6GNfDL5YVbX573KAdrP64RXsiz9y484RhxehFi2uI9CKm7W8pk3YK62+UTQNWN+J9GZLxvKh7wqi2PaH/0r//EACwQAQEAAgIBAwMEAgIDAQAAAAERACExQVEgYXEQgZEwUKGxQMHR8GDh8YD/2gAIAQEAAT8Q/wDwLTzgjxlyLLlOLkLLl7wR7y3L9KP0p9LlMEeHj/wQ8pbBt2nx/eAkF8gnDOv/AFkRSwI5fYcueesUwiIAo1IM3GfGFYeVBGARsK1/nKqZ1F8TFu+N843rTf8AyAYYd0dsHkj+SONCtFM6QB++MZfrKmb7TDcBqFIKU7wCWRNFfF4HLrBcVUYVSTh7YNjTUeUG2u5kP3tSSEhi4GRE5pc3wynhsArx4cIcw9xQC/xgN0mYWLACPWOyaBv8AByaEJLYoAHTxjFFZGhyB2OzXuYtNoAj5QAh7YZ4M7rjwbffAAnD++unaGBzqhyUh7YkIZcJqKfOEI3gFQg+Nv5w0u47i2fhxAgsT2eLEm0rA283zlCkQXS0Puf1hCQ+2bfZ3h/VGIu00Re2YewOm24f935ZbIqcISPtg1dAQQENe2KcjwBf8WBvEnm3ggl9jWU9RVIIzrWBYH/vwpwjS2JUNe5xh6gEECgAhLuZvbLEINyue574grrQogpfbWJDAXug1rxxi8+XF0IzbrneAeGyYodCeNz2ycPfpNQ39/31io0UT3TnOBU0vwPJil9SCFe4d5pBCNv3lwFGtG18sTGYYICM4Q6+2JsGyFnxcTiQ0lHhdfbEEbUIxI1+M2iDo/1GvtgBngKJ4TFlT02fITTheYjFD2eTG4dBOPwuf/RecTEqoRjT7uvtmkH/AGh5ffGOSbUl2HB3/BiEXLSZwO10Zt8FhV5sw9BQiEdLy4kUVABvKznOLeRp+4ZsFltq82YAED60Mp5/YqecajpQAX4OXLpxx/Idn8YshnSh/EMokPj+aRwLa+H/AExdtH/p3m4L97/eQAPBf8mQBJy0PuM/jEin5YD7af7xwaPN/COASiZTz+k4fvPUSAWfIcNytKOadtiEmkMMYZXIBGkdCmxBsmE4v8gsXaxb5PaL4kYRsiFBMLpQPdFkDIXCgqwrklHKiColqDQoTN4dWWqCo0K8DgfWPR4qjGgACw3lzpIfbpAzoWbm8hk7SYYJjR4FxWwyY5rUQMAeB3kvJH/HdnBXhbxpcx1M6AGhKSmDLsmPERvFE6CGEw4SM+AlK6PRTETeVSDU/ABrtMul5GSYAhvpxuy1LwwJnqJNAUpvDndSBpIrKpuiBcJLjkjWyb4b/D3zauxia2gtdTBFAZQPolHqBSifGNESLfjH2iMFQHIuFcOzR1inA5HGxQKMA2G3pLBgz8igpAc1N3jHwDnOmOjSVjNHFT0RZAM0IVDcIjjA0/ZNxBE5BQgmAGBqeKtqGUk4W0xQJ3/mpFQB3jTw+Mp44TDlcBOPvy/ExA2Vcj7rtz736OunNh4lNLQXlvaPcNY8vUITTgp3e6ZvTuD9w3yP79GmD198MO0Jl7VT7JiTwgus+Xv+XzgzIA6Hyfo3/OBogCTVNozJphCDYJAqeW9wSdGcehc6sNaLdZGpk9BIquKEY4jcSXvZRADbR4j3ooXG+URB1ijCjywV75a5PLtrHYzOhHX7rl8u2MQR+cZpED6JYVwUKlPDSQrJSFS2HfySVlK7nCCnLjABkMBNPJHhZFP3snLy8Hg8nAmHWY8OXh73GLxMmckbQCnN0hKPXot6ReWl17dYtuioKsjDUCHkS082EtdpAqp2wDJtUFoBVcSUhwu/7o5XIZEU2DWXDE016XZNbmzhmbJaO1kACx8ltj2TBVjoAFogNubTzXrDUAE3UG2FmEyAWm48iJ4ABri5Lo7fkanxwmmy+pAqu4nYbbBwVCQyBIe4EdHZnW3YpswYmQZAkJyndFQXRj12JuCnW41SAIOuD0RVMmpSmwOnz/jmTJkyZMmTJkyZMmTJkyZMmTJky9OZB/ShGeORD3ccQTD4+8+HGe4wGBldZAQ4ttywxE08j9Ilbm4g3+MmcqFIkk+cHAALsO+Ae7gHz9shwDy1d/GSakmo+mGbb9r/APWe0ffNAZCtv8D7OAS3n1jOpoByvVHLNjLR2AMqINBRB4Yxwii66bpI+zW9Y8AzjARTyh2MHt5CgFGiIlg8xOcZBCI/AAxLrUgkOOVcqhLjyTil5cby4Su8QSTQNF8pi5h5NWG7NK08mnA0xx2UwURVw4AL0Te6hA07g0+MaVNEuGvIgMWJyZykCouM2QjHpHhMToNM3lFlwHTLHAIm17gSOghRQRkzlidYKBNxWtHhjz7BCC5aDEtCjHBZ52tSgFDowo0ArskRadBsJU4zntRRAQsUlpkPGQ8ZDwZDIeMh4yB0ZDwZDxkPGQ8em7UX4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4z2H4yhABVes6d/BHZ5vfg98bztZR7rnuPzlfLnuORFDXmOH5PP1QSJTxmq2ktDdeyT7ZWcUQ2ensGjBnNM8wv8ArHygK1dWccu+PXB5wqLZrjxXcPWdqhrV1CFqSLZMi7Rke1IWro8O8h9Qc+oUCLBY9Y1R53SCkHYtRg9YzVbcPYNNBBdw2XcicQmeUWqCAVMWHkEWZfADI2LNLFBPskhUpZYOt6x6LKqUXY2gPSwaDDALBBLHMIkGso9565GypN1ULq4jXiKtYRBIRsArQJu30GzcgDYUDrNNs26Dg7DEOgDhAlSejOLmoKOxANs3KMALQESx9tCIj0qYpgWIyFDVu74a00xCBtCUmMm/NB9d4TJJoUy6jbG9CvCc10H7KWV6EA8uX8tPryC69/fxhonRx+iUZiaFNtTyYpxlXpSmURNoLX57yHH6HN8+uHnIyed5PlwJ24nymTifLk+cWycjJ48ZA2uRa5O9u8jJWq4EJXAm/sigAG1eDK8HU4Hh7f5+M+fQ8vdwDLxpZGSlksNnmJPzirXiCYFewDvwnnICgVAAwWiXgcJvHJapYE1TkZS71gTYs3M/DNxxOUrJQKoef7ZvvApUaKeZH8YPtcNUChupddONknG1NQ8OyPzlkEIKXRTg53vDrNBGLwea9Ex/MVFDke/tzid+R0XrQ8745wP9fJJ8uJ1bzia0kD6HN8/vqk5wyLM7m6e7u+D5zRo4PQ7c8NNts71kb9IcOy3oLDtgjmSEZ0l0Vxi2RihoQd8jrnDFrtD7qhFWc6wfEbtDuRwWs24LHRSpNu8/X2wLQMFYqnPTJqzFA4Q7oMtfCcrFgpvwdOA81Yl4LStZo0YKJO1BOipAnfGO8JbwqLRK6g6cWMPUqqpu0TBO58m0o9i2W6wbO8gSiDAbTh85NQOiGAaw4rz9Ob5/fXyQUPPdHgN/jEUmaqnK/rz3zUe9YgAg4Gp8erm+f3wyA1HoM2yz0A8/Jb/H6OvOJb/DH/3cfoZivP5M/wDoZHR+TAMp/sM7KPv6ub5/fNeSujsJf3ofdyBo4/Qrg1OsMjo9vpX6UP8AjNjix0nMW9PWU6bS+jarBSCPnDZfrzfP735WY78h4axT5b60IkM6hP79RV378kB06O7g3FoF/kcd4IsOSXWh5VkcTKcXfoGY1tTsyoPk8fTm+fXy4yBxg0+ihcQilyuz0Bwbfb1BF7waX9i2MP7/APuHN9qva9+pmnGKdA4PVEl4EqSnqzCBxRTT7atwB8u7RfB3bwcYpy15NJbdY1dNGAzo8c+pHSOeNDkz+716+tJ3djun9YiM0TS0fGzG4U0TAQctX84W1FkPYx04Uw6y8ht29jLjblR18F8+MnsiLRduy6TrZhhIFCC3bb1q4YYM8gm51pu8bJebRjK1Dzg8/JIjWUmZELGeBo/GDAY78jlNDxrAtJbgAavk3xj3RgGBvladP4cXTWeiCaLyfnTk0C1D4ukK87yEych7jVNEbvJmtQb6N2wqpMczqMW6Cc1184KwnQoTiUQanMxU/wA9V4ifYw/n+GPpUHQY1ODo9ft5yaNamvmhtHqdHzitblPctl4zlt0tBED2bB3qZDx60q6ZVAN3v1rVQq5Qmku+MLOLmm0nVeHGJ7NipaFuYXAlVHDwdEjmvHG8IVs5FKlff7Y5lwaAW+FLMLpwnsng/hgD2jALUT+WaLqFWSDwHZgyKdDNcIKnO5vO6HDYce7HBfdCLes54TDCIPBlALqOvjN6Gj1IJFnunnGZ2gxwlBAvxeMEAKo7SqeTeKxmskJOxv7Y7w+uuRihvBHMwuS00l1iXxCQKttlHJO8QDJLYA2L41PH+fPGOWHVPKv+n49JzrD6rt5/RQWwpwuF98DZFyaXtwA2AePt+jzfPrNvHL4xAWXrCIrAiAPjHQoL1rC9s/GJ9nKtontjDxlAAXzM4zIeMmtBPjEh1PEwV0BPbOa3J51+Mi3X4wB4/GJFYWilE65xAT4/uGFWjb9Iph/nL4Z99aP69PHvoEJ5QfnBs9OaOx2BHI2dfQ/Ae3OED5ZYsYCm8t2LADSj4XcxS8BRItm542cLMHkQoTpaRZO5hQW2paux3hfLC2wIBz0M2VpFj7RXEiZHSJAdLKy4KusD7pUNR5zvy7uYvR8px3g57FCCckVMCFlOk4oPX15vn1ln8WKDQlUKBUaRBHaIv3+A8N1cX54z1S9nGoUJLt12waZjMiZ2yUuKpWPaRUJhFmIR8rR6wQKhoVms4wJoENrnpsVNwewOLY5BBp7AxggZLBQ6Bl2cjH60KIZ4RVWJFXKSyhVRQJRRG7pJN8VGkdDUUHaPi8otuvZiMVCGKgAmNdgFkZVeArq7QHqsgxEUaAzTYAgQgCzV0E1cU1akFA/EkFKsBRls0oVIwCjI2xuQ6hdSOSHp82G6CwVpocNFNJOMA+8CGBsELC7pcL+dNlPprQpB2qNUWbNwMaellQA3v0Y0aDolNbSYxaQ9tpjKojCrDLo4el/g0GXGQUKiIUjvz/kv2QXNgX+ffpf2Gj0MWYAr4mJ5hNBbTWjRveBBBEq0PKaIcLi52PBhaQ1A8/OJB1es1exQ884xmxSYqQ5VcK0ojrhiWSrXxc4BoCRUF3C8/GT3/dvbZBwOm+MQFxEg5XLBT3YMiJIHDiNaVwUxsggH3Pcxz0/KKJId6njFu7Qhz6V6WbT4uM5Gh7EAgNCtC/Xm+fW+3XCx0QFkRbMPpS4mIhsVUaQBbg2S4g8Ua0BSwQuJd16HwISMUWOmJm5gLWzEFakKuH7fXxdFgAAihxk8Zqi2GFSSUlS4tRUUK8xoDsKd5oZFCsGaCeMLmu3mMlA8EDfJcHGUwdEU7lAAErUPoHEVoIaFkQYzAhCum0dzufDvGea5zWFm/siFyUivHd6KsEqcRLgjl4BwrWo8AMDhp3/2QADIZKlKpPQYyhq46GKAGPWUIbUjsEU8g7yTd6IwkYGo5fFnEQlOy6b1PRuQUcSCwoKhakSmazmXyCo3P+Bq5aR1dsdRFRCPSRBygaAgUzVAaARyx5oArAOKOUFUyALgjw/oD2AhVrhojr/APHjx48ePHjx48ePHjzzLqma8wQPuPoKFCgjaOPWKXLly5UEq8cZHRpK48wyfSPjAmJvjI4HjJ19CPAxxfCbzlxwvzF39eb59c1PkogCU0VtC0GI4WdMjgNNpVLcAPM8SjgUgEMFN49r3fYK7ilEjsmIF5ilLeXOmEKTCGdD/AI5kTQSwYN4Z8swyyReKdmym8SO9sy0AzpOsDYmeKr0oO3hJTBlSZ5VoCGl0KDbGYYYakuR0XXh5fkqIheSNrNbodugRqE00Q6EEFBTHfbvvaBAap4YdSjH7YVEmlGm7TLI6qXZIJVIQpJc18+lSkAdNJsRFEcev0ylHIE65BaBcIKFA8i8ek23qm8dfU7INkGHhHkLhx7GoHZFSnClCl552k1FOM10aCKBqMHzTUwNczDb2SHRTeuN79wASsCyDEGpoCoYpgPVMr8hrbyE3h8NvyKozIJHaEmaNlUAgQpC8u4bxOB9IAJRFLBCRQy/nYAcIaUHYyg+rlaZ8s+WfLPlnyz5Z8s+WfLPlnyz5Z8s+WfLLB5HLiql9lnvs99nvs3A273nus91nus91nus91kxQb1Jxdxnvhbv6Q8emY25w9PN8+vjpScGfrFjPMGRgqgmITZgQRTSPAw0xTWLAaNb2d8Qe636DElxBs1vt1DFh+EUBM2ofRiLhxu6ZcwkJ7fUwmOKRIhClZUhptM2KmrvBLXNaNcOfVXbWHWJ1lMNSRhOiAJbd6jNNJXR0Dzj9pnA/FABqReNWjYLyvq0U6cBs0L+UsHEA8WApISrOk9JInWSMRYADNUItMqXQcEE6RAkFgWA61i+QqhZiHDQqGw76rFlJizzSrWmdbF0ecQi3gC1BHUAcBqjWQkYNFg5HukaplRPFMSKCEigMFGC6dIvFNvUWKhtQgr4XYPdN4ij0rtiECUBbNCOwhxSqxQFFo1g1ktLLQ4hJ3znPHERHoq9M19yQAtF241gHgBBj67iO7GnhVENf4xKTGdEgj8/r04hk6PWF/SmpiT0c3z6wcucgER3BIrhpccRGSAc3PA6Y4ZwWpBYioQ0FJtgI2l3MBp9ipjEykSBoagIFiPDn4h4wpuod1oF5MO8JxsAkDQVuoZwc/cdZV2cjDT4xTPRqDiWtObNY2cCMmCzdBsNaec28VbF2ivWGwVEzamMFAW6KPvqc4wFGUrSebgDEOqcBA/k9s5107SMreCF4EXTnM9E+wE0PTd4O7qFQCqCI7xQ7MGYJECNNBcIDhBxQHgQdgmJ9pp5MVxS9uNQK3Ud5UmemfmrftHBlAyzPvX3JMh4yHjIeDIeMh4yHjIeP8dx/6BQb/I/Ux35vUFzj0RwEE1HaB1/ezCBHGC0FOe/49XL683z6wu5iDK4+m+BbNbAyyxc07Dp0TXNto6JCb2NeBh4OIIbAFBtIKYZqhLYt6c2Q6ldYa5g0yn3vcQXbjKuERXVCJMRwUzNJpXdscILyGogyVcVwbKpcBYW9qQE0NwZ4iT4C+BS/6zM9d6HdLcKL/hAVsIDVjTnOGEXcB2gFtZvblo4m89nGiUKKtJRYBOGaABuqoDk3X+Yw2oDkdMCMlpOS2Nsh36qIikTjIlyTQS6A0o0Sh8F97kADQgDLBip6WSgODoWcSR8BRv8AMuYLvH/Atc4oRSYajB1qTAFJIUjHk/zXFN0VHFdP4/h6P53pC4E9KuwwVfWDGbrQ3gCOA7PjEntgiTqOqTXqT683z64OLk84tihN4NV5YErnkx6B1nzZHGTJvIycn3yLa5qrv6RdoIUnbdFTk1gHBkf7ycny5suTb3lOazAHn/O6A2W9p/Fv2zXX0OcEL39PD1arhR2rD+8al8fdgD7PLO4nINiOoj7S94oqgAth17elx+nN8/vcOaHyJH+8LdFKnAdP3I/f6WbmGN8l9B6kollw8p1dN5B2u3n385KvGdgflEAwjU36jeD2Kt93FpQpYcHsepn05vn97cEjLR0OT8lPt9eI/Ufb9JzfP75pYEJbPf2GYnBRCQc/SkHJ+kQyywUBTvZlp6cqotKi0mrgHDLcUWdW7THjzkTomRYFIsJyIjmhGbuAQFqGnZ6uH05vn19EfnBHhMo8OU8mU85Tz9PYa98p5ynkynkynkynnOKwTfYF5cpoTKecp5/ZYeMgUaDNzj7HD7T61gIWn6CnnNANlCqES+FzSmxQ8yVUdVhj90GXb7KRrQAcv8NmsARJKmiHON23Q/Iiu4T26ynn08PpzfPrAEtbKabRjy+hEF5PuH2cKRWP3AvaOJq2U6Sn4Gn2c0GsAgpF2cmI51N+ajJuHlOcr9MHkBZiGIMqs+X4wyo1oopLl2YbR0Ka7H0o63i4JMaSpXenHmkDgciWWBU4xrhYZSAHLAr1jvfeekUfId5EJTbEK8QoE5uHFE2/oQvBXfxjBZfO/VGg/OBHf7K30BWkImCdUv3fK+a/H07G/o+onHpHgCUggrrD/RfzXC2fb7XEiUMMuduj89zJq22DM0aEHnvG9crwqJoMbPtiIMplBWmoG/4uNFDGauXmFEw2X0P05vn1jIZABXbnetYGJSr0JvrtedswGxJDbxR1P9ucL+s0l2Ix/wA4cGjasVg4NDgcD0hxzcNOfGOSlZ2htwzHjJkPkc04omRI2lKOQnfBXaaJt1T2ykKvI0OXlXWD29sGvGmLdSrQgue/fHAdkKltsdeMb5FNB2Jb2wJjfC2uEdKdvjEUI3aDNjhv7Yrrx+zStNBOFof94ypc3sPHsP8AeshdZszlx9Te/QHqEvFQhG8TVNKLtHaVjsZEWhJaWlOzXGsYxTqUlJvit+MSYg6uGV6eco0EwW432HvidnDzfO9Y4eE8YXu/f0L9Ob59b5TJ7MdMaDAkodiInTk5awRqkRmxHEKMg6q124/OFVYBj0UawDGIjvNd0/OS+s5amJDgKqwDDMCOqbomk98FG4hRHscfKjRY5YcJTTveOKEVMROEenDf7oN+ZDAAAqWAeXBpYIpcImk98p5zg8R9AAr2qB7uU85T9iTyGpFfE+V2Y0xXz0k7H/7lw/8AmXQ3+jMd847yA6b8+hfD9DejvjNktnZePWxQj3AeTdBUDbCg6AgoLL0X3bmGbxyDBaC4FDRp059IgYnoFkhBEzNQzbyl/Wlsqi7w95+wxKokCYt1w2XaoTeWcAXddlXjshsqAkhRK17wGWvYEadOYrTdzUB4SDueBlb5zZU8awNhRy2cqDahd4Llg9g5NXrawESIZneQoVaAXJRhOpokE1t2NiQhUFaBBqay+W/uMnJ1QF0oXEY8NJbQvrlHeGTFBV/U4IkApdMOMF0sTKG5THYTBwDF9pZ5MIg0COI1vbQDPAJNRbM0xF5uZXUjlHZcLVJxh0TsJFoSbP1ZsynnKecp5ynnKecp5ynnKecp5ynnKecp5ynnKecp5ynnKecp5ynnKecp5wsl6I98eTyd4yQi0o+3h9sPyOnG4h9sj4w8ZwEqY+Eef03JMjZ24ZhV2e2c3z66/USMjhJiHYg3WGXLkrw3JQjXBXGgiixBTWgKDQgGVz4SFFZWMhQZoyN4gA+GQDqyaTAG2auyK6/dL74+LnN7AGaBBTAx8gGoJTYbwecCGIDGsHLiq+ePGEyEOaET1g7OzEGGtFA1sKW2mTVbGDSdgAygOjwYYdLRONvYBTXIgBC3EvFGXUqs24rvIectFEbDXhjVj2CJUY3ZXnPPVcVpvKmcb4wUCBIx3U2witlxwd9mYPbSqVRXCegOCIa8B0M3i5YqLsCdqAw2xTBM10gdhYEY3RliOWSJ16HFn15JP0tTU6MHcJd8/wCPMmTJkyZMmTJkyZMmTJkyZMmTJDEZ2mfZxJUVUj8XX43842kRRG4/FzaXPJ/z5Xf/AEfnFwBb2l2v98fpNmsMLRLhlee3xm3za8+1yvjWFu2zabb4D2PWTcj8BlR1tB52YzTI/BSwhQyOrT4DGg1GbLcqq8UGuMgISAoSoLdll3n+eCuQqhI2JjsDTmhIALVtQHIIQoAHuzTSDNpTBvnDJYgENpJu2SZYu8YM1K54KWJpAvwwkULSjICH+RMn1KKXUFFisMarqIvLAmOLE8ckeHVhXagbcPa0IqqiA0gBRmLqiuwINnnOUqw1+smm41xC5VKwEBEdcT042eDMhk8nTZpUNxh5QdsPvlzoj0oheViXamQroLElDgRTBQgU0jiNgKEpmlPTyOAlMCAJEYmY4qoBAyCnQRRe/AmPHggm26d4GAJg0sgObMhDjBDcUJV0ZFho39hlxB5MKPfqCvZx92/fN1KN5nlyH8mKqkex/wC6xcJe7lv6CzCrCucpjxm4MQX3S/oxE1R4G+Ofv17YMRoCAfGR49ajxJlLJ1NqaVJovyBCAWtEiI7JjDG6tFGtndbu/LHELqxHBQVRoRxsGFU6uTZcvAYuF91yn8AQZKJZGZTPfUS9DrkERFBEHp+Kr9wtoMBN3GJqSfimoJSOywJ6tApgLwrZePnFMQ0+A8QYjaIjkkkhAgIGgBOPRhoKkKP3ciSTvF9CNGgjdwrV5wpaIFDGEBOgA0ap9V/hE2EXKbDNS4LqnnWUjpXQ9uO/8I11YxQVBEOcu36m+XZR48qaUBItWxZRK4+jCt+DPoZZNOesCyRtzehe3masxYKn6vASYlElAx9G2UPF7NmhotgNrgCdgQ0hEV1MKG1B5ApsEBIT9kFJi3Y87Pk5+9wQI6O/iCfxj7KOof71/rJti8FfhxurxpzkZfZ/GHAf4yjFPl3nVCy5+TX85Qa88F8afzju8y1L7H+1wiBQAAfB+kITWvioPQFgoLUMeOGo4UHk9Bj5MZ6rViHxQtjLqbx+gBCsiPaJPN1hPVAViIulschuTLBrqPv6XwXevG8GqKnkeHKLGgKgYyW6yk2NE6Bg3OJN7ZhakIQSgusJtpCVd7RIpKaHJNtdG0QCkOLKnWHjsmBRAFB0DVihkBVmLLZACATm+XA8fDHiPkqUB2a9KXDR+2xkQHx/amWFVba/szcu+4/3cXbD2yOah4Z/oxLkexfi5HqnH8olwJADwfqnUJ2qQnBKabKY4fwB1Et8Fprba1CSHd50X4WjdB6wJvlCSg2Dk84DQCUcWGgJeodcW9bM+dmKVsBgJg5EaSLcajAoF9xWEUogGtzwAaDDNH25VtMoeVHHYP3pZRkliAiU7A+NepDsgCHBmeugyEiBDtQ5GFIa7PKqK0QnVQwtkSgbcnALBXjLHN/8Lh/+Sv/Z" />
</div>
<p>Source: <a href="https://rapidminer.com/artificial-intelligence-machine-learning-deep-learning/">rapidminer</a></p>
</div>
<div class="slide section level2">
<h2>定義機器學習</h2>
<p><a href="https://en.wikipedia.org/wiki/Arthur_Samuel">Arthur Samuel</a></p>
<blockquote>
<p>The field of study that gives computers the ability to learn without being explicitly programmed.</p>
</blockquote>
</div>
<div id="2" class="slide section level2">
<h2>定義機器學習(2)</h2>
<p><a href="http://www.cs.cmu.edu/~tom/">Tom Mitchell</a></p>
<blockquote>
<p>A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.</p>
</blockquote>
</div>
<div id="3" class="slide section level2">
<h2>定義機器學習(3)</h2>
<p><a href="http://www.csie.ntu.edu.tw/~htlin/">林軒田</a></p>
<blockquote>
<p>我們從小是怎麼樣辨認一棵樹的,是爸爸媽媽告訴我們一百條規則來定義嗎?其實不是的,很大一部分是透過我們自己的觀察很多的樹與不是樹之後,得到並且內化了辨認一棵樹的技巧,機器學習想要做的就是一樣的事情。</p>
</blockquote>
</div>
<div class="slide section level2">
<h2>機器學習的種類</h2>
<ul>
<li>監督式學習(Supervised Learning):具有目標變數的 Labeled data
<ul>
<li>Gmail 會幫你分類郵件</li>
<li><a href="https://youtu.be/ACmydtFDTGs">Jin Yang’s Hot Dog Claasifier</a></li>
</ul></li>
<li>非監督式學習(Unsupervised Learning):沒有目標變數的 Unlabeled data
<ul>
<li>將客戶分成不同的 Segments</li>
<li>降維時所使用的主成份分析</li>
</ul></li>
</ul>
</div>
<div id="2" class="slide section level2">
<h2>機器學習的種類(2)</h2>
<ul>
<li>監督式學習(Supervised Learning)
<ul>
<li>迴歸問題:目標變數是連續型(數值),像是股價、氣溫、匯率、房價…等</li>
<li>分類問題:目標變數是離散型(類別),像是垃圾郵件/非垃圾郵件、熱狗/非熱狗…等</li>
</ul></li>
</ul>
</div>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>