Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active August 29, 2015 14:19
Show Gist options
  • Save timelyportfolio/d6658135f11023171587 to your computer and use it in GitHub Desktop.
Save timelyportfolio/d6658135f11023171587 to your computer and use it in GitHub Desktop.
R base graphics plot using stateface from propublica

base plots with stateface

Why should ggplot2 have all the stateface fun? In this previous example, I did a quick example using the state font library with ggplot2 in R. In this example (see it here), we do a simple example with stateface in a base graphics plot. To make it even prettier, I added the svgPanZoom htmlwidget (see post).

live example

See it live here.

Please reproduce and extend.

svgPanZoom(svgPlot({
    plot(1:10,type="n")
    points(1:10,pch="j",family="StateFace")
}))
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript,%28function%28%29%20%7B%0A%20%20%2F%2F%20If%20window%2EHTMLWidgets%20is%20already%20defined%2C%20then%20use%20it%3B%20otherwise%20create%20a%0A%20%20%2F%2F%20new%20object%2E%20This%20allows%20preceding%20code%20to%20set%20options%20that%20affect%20the%0A%20%20%2F%2F%20initialization%20process%20%28though%20none%20currently%20exist%29%2E%0A%20%20window%2EHTMLWidgets%20%3D%20window%2EHTMLWidgets%20%7C%7C%20%7B%7D%3B%0A%0A%20%20%2F%2F%20See%20if%20we%27re%20running%20in%20a%20viewer%20pane%2E%20If%20not%2C%20we%27re%20in%20a%20web%20browser%2E%0A%20%20var%20viewerMode%20%3D%20window%2EHTMLWidgets%2EviewerMode%20%3D%0A%20%20%20%20%20%20%2F%5Cbviewer%5Fpane%3D1%5Cb%2F%2Etest%28window%2Elocation%29%3B%0A%0A%20%20%2F%2F%20See%20if%20we%27re%20running%20in%20Shiny%20mode%2E%20If%20not%2C%20it%27s%20a%20static%20document%2E%0A%20%20%2F%2F%20Note%20that%20static%20widgets%20can%20appear%20in%20both%20Shiny%20and%20static%20modes%2C%20but%0A%20%20%2F%2F%20obviously%2C%20Shiny%20widgets%20can%20only%20appear%20in%20Shiny%20apps%2Fdocuments%2E%0A%20%20var%20shinyMode%20%3D%20window%2EHTMLWidgets%2EshinyMode%20%3D%0A%20%20%20%20%20%20typeof%28window%2EShiny%29%20%21%3D%3D%20%22undefined%22%20%26%26%20%21%21window%2EShiny%2EoutputBindings%3B%0A%0A%20%20%2F%2F%20We%20can%27t%20count%20on%20jQuery%20being%20available%2C%20so%20we%20implement%20our%20own%0A%20%20%2F%2F%20version%20if%20necessary%2E%0A%20%20function%20querySelectorAll%28scope%2C%20selector%29%20%7B%0A%20%20%20%20if%20%28typeof%28jQuery%29%20%21%3D%3D%20%22undefined%22%20%26%26%20scope%20instanceof%20jQuery%29%20%7B%0A%20%20%20%20%20%20return%20scope%2Efind%28selector%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28scope%2EquerySelectorAll%29%20%7B%0A%20%20%20%20%20%20return%20scope%2EquerySelectorAll%28selector%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20asArray%28value%29%20%7B%0A%20%20%20%20if%20%28value%20%3D%3D%3D%20null%29%0A%20%20%20%20%20%20return%20%5B%5D%3B%0A%20%20%20%20if%20%28%24%2EisArray%28value%29%29%0A%20%20%20%20%20%20return%20value%3B%0A%20%20%20%20return%20%5Bvalue%5D%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Implement%20jQuery%27s%20extend%0A%20%20function%20extend%28target%20%2F%2A%2C%20%2E%2E%2E%20%2A%2F%29%20%7B%0A%20%20%20%20if%20%28arguments%2Elength%20%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20return%20target%3B%0A%20%20%20%20%7D%0A%20%20%20%20for%20%28var%20i%20%3D%201%3B%20i%20%3C%20arguments%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20source%20%3D%20arguments%5Bi%5D%3B%0A%20%20%20%20%20%20for%20%28var%20prop%20in%20source%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28source%2EhasOwnProperty%28prop%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20target%5Bprop%5D%20%3D%20source%5Bprop%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20target%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Replaces%20the%20specified%20method%20with%20the%20return%20value%20of%20funcSource%2E%0A%20%20%2F%2F%0A%20%20%2F%2F%20Note%20that%20funcSource%20should%20not%20BE%20the%20new%20method%2C%20it%20should%20be%20a%20function%0A%20%20%2F%2F%20that%20RETURNS%20the%20new%20method%2E%20funcSource%20receives%20a%20single%20argument%20that%20is%0A%20%20%2F%2F%20the%20overridden%20method%2C%20it%20can%20be%20called%20from%20the%20new%20method%2E%20The%20overridden%0A%20%20%2F%2F%20method%20can%20be%20called%20like%20a%20regular%20function%2C%20it%20has%20the%20target%20permanently%0A%20%20%2F%2F%20bound%20to%20it%20so%20%22this%22%20will%20work%20correctly%2E%0A%20%20function%20overrideMethod%28target%2C%20methodName%2C%20funcSource%29%20%7B%0A%20%20%20%20var%20superFunc%20%3D%20target%5BmethodName%5D%20%7C%7C%20function%28%29%20%7B%7D%3B%0A%20%20%20%20var%20superFuncBound%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20superFunc%2Eapply%28target%2C%20arguments%29%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20target%5BmethodName%5D%20%3D%20funcSource%28superFuncBound%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Implement%20a%20vague%20facsimilie%20of%20jQuery%27s%20data%20method%0A%20%20function%20elementData%28el%2C%20name%2C%20value%29%20%7B%0A%20%20%20%20if%20%28arguments%2Elength%20%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20return%20el%5B%22htmlwidget%5Fdata%5F%22%20%2B%20name%5D%3B%0A%20%20%20%20%7D%20else%20if%20%28arguments%2Elength%20%3D%3D%203%29%20%7B%0A%20%20%20%20%20%20el%5B%22htmlwidget%5Fdata%5F%22%20%2B%20name%5D%20%3D%20value%3B%0A%20%20%20%20%20%20return%20el%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Wrong%20number%20of%20arguments%20for%20elementData%3A%20%22%20%2B%0A%20%20%20%20%20%20%20%20arguments%2Elength%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20http%3A%2F%2Fstackoverflow%2Ecom%2Fquestions%2F3446170%2Fescape%2Dstring%2Dfor%2Duse%2Din%2Djavascript%2Dregex%0A%20%20function%20escapeRegExp%28str%29%20%7B%0A%20%20%20%20return%20str%2Ereplace%28%2F%5B%5C%2D%5C%5B%5C%5D%5C%2F%5C%7B%5C%7D%5C%28%5C%29%5C%2A%5C%2B%5C%3F%5C%2E%5C%5C%5C%5E%5C%24%5C%7C%5D%2Fg%2C%20%22%5C%5C%24%26%22%29%3B%0A%20%20%7D%0A%0A%20%20function%20hasClass%28el%2C%20className%29%20%7B%0A%20%20%20%20var%20re%20%3D%20new%20RegExp%28%22%5C%5Cb%22%20%2B%20escapeRegExp%28className%29%20%2B%20%22%5C%5Cb%22%29%3B%0A%20%20%20%20return%20re%2Etest%28el%2EclassName%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20elements%20%2D%20array%20%28or%20array%2Dlike%20object%29%20of%20HTML%20elements%0A%20%20%2F%2F%20className%20%2D%20class%20name%20to%20test%20for%0A%20%20%2F%2F%20include%20%2D%20if%20true%2C%20only%20return%20elements%20with%20given%20className%3B%0A%20%20%2F%2F%20%20%20if%20false%2C%20only%20return%20elements%20%2Awithout%2A%20given%20className%0A%20%20function%20filterByClass%28elements%2C%20className%2C%20include%29%20%7B%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20elements%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28hasClass%28elements%5Bi%5D%2C%20className%29%20%3D%3D%20include%29%0A%20%20%20%20%20%20%20%20results%2Epush%28elements%5Bi%5D%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%0A%0A%20%20function%20on%28obj%2C%20eventName%2C%20func%29%20%7B%0A%20%20%20%20if%20%28obj%2EaddEventListener%29%20%7B%0A%20%20%20%20%20%20obj%2EaddEventListener%28eventName%2C%20func%2C%20false%29%3B%0A%20%20%20%20%7D%20else%20if%20%28obj%2EattachEvent%29%20%7B%0A%20%20%20%20%20%20obj%2EattachEvent%28eventName%2C%20func%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20off%28obj%2C%20eventName%2C%20func%29%20%7B%0A%20%20%20%20if%20%28obj%2EremoveEventListener%29%0A%20%20%20%20%20%20obj%2EremoveEventListener%28eventName%2C%20func%2C%20false%29%3B%0A%20%20%20%20else%20if%20%28obj%2EdetachEvent%29%20%7B%0A%20%20%20%20%20%20obj%2EdetachEvent%28eventName%2C%20func%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Translate%20array%20of%20values%20to%20top%2Fright%2Fbottom%2Fleft%2C%20as%20usual%20with%0A%20%20%2F%2F%20the%20%22padding%22%20CSS%20property%0A%20%20%2F%2F%20https%3A%2F%2Fdeveloper%2Emozilla%2Eorg%2Fen%2DUS%2Fdocs%2FWeb%2FCSS%2Fpadding%0A%20%20function%20unpackPadding%28value%29%20%7B%0A%20%20%20%20if%20%28typeof%28value%29%20%3D%3D%3D%20%22number%22%29%0A%20%20%20%20%20%20value%20%3D%20%5Bvalue%5D%3B%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%201%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B0%5D%2C%20bottom%3A%20value%5B0%5D%2C%20left%3A%20value%5B0%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B1%5D%2C%20bottom%3A%20value%5B0%5D%2C%20left%3A%20value%5B1%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%203%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B1%5D%2C%20bottom%3A%20value%5B2%5D%2C%20left%3A%20value%5B1%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28value%2Elength%20%3D%3D%3D%204%29%20%7B%0A%20%20%20%20%20%20return%20%7Btop%3A%20value%5B0%5D%2C%20right%3A%20value%5B1%5D%2C%20bottom%3A%20value%5B2%5D%2C%20left%3A%20value%5B3%5D%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Convert%20an%20unpacked%20padding%20object%20to%20a%20CSS%20value%0A%20%20function%20paddingToCss%28paddingObj%29%20%7B%0A%20%20%20%20return%20paddingObj%2Etop%20%2B%20%22px%20%22%20%2B%20paddingObj%2Eright%20%2B%20%22px%20%22%20%2B%20paddingObj%2Ebottom%20%2B%20%22px%20%22%20%2B%20paddingObj%2Eleft%20%2B%20%22px%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Makes%20a%20number%20suitable%20for%20CSS%0A%20%20function%20px%28x%29%20%7B%0A%20%20%20%20if%20%28typeof%28x%29%20%3D%3D%3D%20%22number%22%29%0A%20%20%20%20%20%20return%20x%20%2B%20%22px%22%3B%0A%20%20%20%20else%0A%20%20%20%20%20%20return%20x%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20Retrieves%20runtime%20widget%20sizing%20information%20for%20an%20element%2E%0A%20%20%2F%2F%20The%20return%20value%20is%20either%20null%2C%20or%20an%20object%20with%20fill%2C%20padding%2C%0A%20%20%2F%2F%20defaultWidth%2C%20defaultHeight%20fields%2E%0A%20%20function%20sizingPolicy%28el%29%20%7B%0A%20%20%20%20var%20sizingEl%20%3D%20document%2EquerySelector%28%22script%5Bdata%2Dfor%3D%27%22%20%2B%20el%2Eid%20%2B%20%22%27%5D%5Btype%3D%27application%2Fhtmlwidget%2Dsizing%27%5D%22%29%3B%0A%20%20%20%20if%20%28%21sizingEl%29%0A%20%20%20%20%20%20return%20null%3B%0A%20%20%20%20var%20sp%20%3D%20JSON%2Eparse%28sizingEl%2EtextContent%20%7C%7C%20sizingEl%2Etext%20%7C%7C%20%22%7B%7D%22%29%3B%0A%20%20%20%20if%20%28viewerMode%29%20%7B%0A%20%20%20%20%20%20return%20sp%2Eviewer%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20sp%2Ebrowser%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20initSizing%28el%29%20%7B%0A%20%20%20%20var%20sizing%20%3D%20sizingPolicy%28el%29%3B%0A%20%20%20%20if%20%28%21sizing%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20var%20cel%20%3D%20document%2EgetElementById%28%22htmlwidget%5Fcontainer%22%29%3B%0A%20%20%20%20if%20%28%21cel%29%0A%20%20%20%20%20%20return%3B%0A%0A%20%20%20%20if%20%28typeof%28sizing%2Epadding%29%20%21%3D%3D%20%22undefined%22%29%20%7B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Emargin%20%3D%20%220%22%3B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Epadding%20%3D%20paddingToCss%28unpackPadding%28sizing%2Epadding%29%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28sizing%2Efill%29%20%7B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Eoverflow%20%3D%20%22hidden%22%3B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20document%2Ebody%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20document%2EdocumentElement%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20document%2EdocumentElement%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20if%20%28cel%29%20%7B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Eposition%20%3D%20%22absolute%22%3B%0A%20%20%20%20%20%20%20%20var%20pad%20%3D%20unpackPadding%28sizing%2Epadding%29%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Etop%20%3D%20pad%2Etop%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Eright%20%3D%20pad%2Eright%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Ebottom%20%3D%20pad%2Ebottom%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20cel%2Estyle%2Eleft%20%3D%20pad%2Eleft%20%2B%20%22px%22%3B%0A%20%20%20%20%20%20%20%20el%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%20%20el%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20getWidth%3A%20function%28%29%20%7B%20return%20cel%2EoffsetWidth%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20getHeight%3A%20function%28%29%20%7B%20return%20cel%2EoffsetHeight%3B%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20el%2Estyle%2Ewidth%20%3D%20px%28sizing%2Ewidth%29%3B%0A%20%20%20%20%20%20el%2Estyle%2Eheight%20%3D%20px%28sizing%2Eheight%29%3B%0A%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20getWidth%3A%20function%28%29%20%7B%20return%20el%2EoffsetWidth%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20getHeight%3A%20function%28%29%20%7B%20return%20el%2EoffsetHeight%3B%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Default%20implementations%20for%20methods%0A%20%20var%20defaults%20%3D%20%7B%0A%20%20%20%20find%3A%20function%28scope%29%20%7B%0A%20%20%20%20%20%20return%20querySelectorAll%28scope%2C%20%22%2E%22%20%2B%20this%2Ename%29%3B%0A%20%20%20%20%7D%2C%0A%20%20%20%20renderError%3A%20function%28el%2C%20err%29%20%7B%0A%20%20%20%20%20%20var%20%24el%20%3D%20%24%28el%29%3B%0A%0A%20%20%20%20%20%20this%2EclearError%28el%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Add%20all%20these%20error%20classes%2C%20as%20Shiny%20does%0A%20%20%20%20%20%20var%20errClass%20%3D%20%22shiny%2Doutput%2Derror%22%3B%0A%20%20%20%20%20%20if%20%28err%2Etype%20%21%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20use%20the%20classes%20of%20the%20error%20condition%20as%20CSS%20class%20names%0A%20%20%20%20%20%20%20%20errClass%20%3D%20errClass%20%2B%20%22%20%22%20%2B%20%24%2Emap%28asArray%28err%2Etype%29%2C%20function%28type%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20errClass%20%2B%20%22%2D%22%20%2B%20type%3B%0A%20%20%20%20%20%20%20%20%7D%29%2Ejoin%28%22%20%22%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20errClass%20%3D%20errClass%20%2B%20%22%20htmlwidgets%2Derror%22%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Is%20el%20inline%20or%20block%3F%20If%20inline%20or%20inline%2Dblock%2C%20just%20display%3Anone%20it%0A%20%20%20%20%20%20%2F%2F%20and%20add%20an%20inline%20error%2E%0A%20%20%20%20%20%20var%20display%20%3D%20%24el%2Ecss%28%22display%22%29%3B%0A%20%20%20%20%20%20%24el%2Edata%28%22restore%2Ddisplay%2Dmode%22%2C%20display%29%3B%0A%0A%20%20%20%20%20%20if%20%28display%20%3D%3D%3D%20%22inline%22%20%7C%7C%20display%20%3D%3D%3D%20%22inline%2Dblock%22%29%20%7B%0A%20%20%20%20%20%20%20%20%24el%2Ehide%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28err%2Emessage%20%21%3D%3D%20%22%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20errorSpan%20%3D%20%24%28%22%3Cspan%3E%22%29%2EaddClass%28errClass%29%3B%0A%20%20%20%20%20%20%20%20%20%20errorSpan%2Etext%28err%2Emessage%29%3B%0A%20%20%20%20%20%20%20%20%20%20%24el%2Eafter%28errorSpan%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20if%20%28display%20%3D%3D%3D%20%22block%22%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20block%2C%20add%20an%20error%20just%20after%20the%20el%2C%20set%20visibility%3Anone%20on%20the%0A%20%20%20%20%20%20%20%20%2F%2F%20el%2C%20and%20position%20the%20error%20to%20be%20on%20top%20of%20the%20el%2E%0A%20%20%20%20%20%20%20%20%2F%2F%20Mark%20it%20with%20a%20unique%20ID%20and%20CSS%20class%20so%20we%20can%20remove%20it%20later%2E%0A%20%20%20%20%20%20%20%20%24el%2Ecss%28%22visibility%22%2C%20%22hidden%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28err%2Emessage%20%21%3D%3D%20%22%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20errorDiv%20%3D%20%24%28%22%3Cdiv%3E%22%29%2EaddClass%28errClass%29%2Ecss%28%22position%22%2C%20%22absolute%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22top%22%2C%20el%2EoffsetTop%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22left%22%2C%20el%2EoffsetLeft%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20setting%20width%20can%20push%20out%20the%20page%20size%2C%20forcing%20otherwise%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20unnecessary%20scrollbars%20to%20appear%20and%20making%20it%20impossible%20for%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20the%20element%20to%20shrink%3B%20so%20use%20max%2Dwidth%20instead%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22maxWidth%22%2C%20el%2EoffsetWidth%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22height%22%2C%20el%2EoffsetHeight%29%3B%0A%20%20%20%20%20%20%20%20%20%20errorDiv%2Etext%28err%2Emessage%29%3B%0A%20%20%20%20%20%20%20%20%20%20%24el%2Eafter%28errorDiv%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Really%20dumb%20way%20to%20keep%20the%20size%2Fposition%20of%20the%20error%20in%20sync%20with%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20the%20parent%20element%20as%20the%20window%20is%20resized%20or%20whatever%2E%0A%20%20%20%20%20%20%20%20%20%20var%20intId%20%3D%20setInterval%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%21errorDiv%5B0%5D%2EparentElement%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20clearInterval%28intId%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20errorDiv%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22top%22%2C%20el%2EoffsetTop%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22left%22%2C%20el%2EoffsetLeft%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22maxWidth%22%2C%20el%2EoffsetWidth%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2Ecss%28%22height%22%2C%20el%2EoffsetHeight%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%20500%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20clearError%3A%20function%28el%29%20%7B%0A%20%20%20%20%20%20var%20%24el%20%3D%20%24%28el%29%3B%0A%20%20%20%20%20%20var%20display%20%3D%20%24el%2Edata%28%22restore%2Ddisplay%2Dmode%22%29%3B%0A%20%20%20%20%20%20%24el%2Edata%28%22restore%2Ddisplay%2Dmode%22%2C%20null%29%3B%0A%0A%20%20%20%20%20%20if%20%28display%20%3D%3D%3D%20%22inline%22%20%7C%7C%20display%20%3D%3D%3D%20%22inline%2Dblock%22%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28display%29%0A%20%20%20%20%20%20%20%20%20%20%24el%2Ecss%28%22display%22%2C%20display%29%3B%0A%20%20%20%20%20%20%20%20%24%28el%2EnextSibling%29%2Efilter%28%22%2Ehtmlwidgets%2Derror%22%29%2Eremove%28%29%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28display%20%3D%3D%3D%20%22block%22%29%7B%0A%20%20%20%20%20%20%20%20%24el%2Ecss%28%22visibility%22%2C%20%22inherit%22%29%3B%0A%20%20%20%20%20%20%20%20%24%28el%2EnextSibling%29%2Efilter%28%22%2Ehtmlwidgets%2Derror%22%29%2Eremove%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%0A%20%20%20%20sizing%3A%20%7B%7D%0A%20%20%7D%3B%0A%0A%20%20%2F%2F%20Called%20by%20widget%20bindings%20to%20register%20a%20new%20type%20of%20widget%2E%20The%20definition%0A%20%20%2F%2F%20object%20can%20contain%20the%20following%20properties%3A%0A%20%20%2F%2F%20%2D%20name%20%28required%29%20%2D%20A%20string%20indicating%20the%20binding%20name%2C%20which%20will%20be%0A%20%20%2F%2F%20%20%20used%20by%20default%20as%20the%20CSS%20classname%20to%20look%20for%2E%0A%20%20%2F%2F%20%2D%20initialize%20%28optional%29%20%2D%20A%20function%28el%29%20that%20will%20be%20called%20once%20per%0A%20%20%2F%2F%20%20%20widget%20element%3B%20if%20a%20value%20is%20returned%2C%20it%20will%20be%20passed%20as%20the%20third%0A%20%20%2F%2F%20%20%20value%20to%20renderValue%2E%0A%20%20%2F%2F%20%2D%20renderValue%20%28required%29%20%2D%20A%20function%28el%2C%20data%2C%20initValue%29%20that%20will%20be%0A%20%20%2F%2F%20%20%20called%20with%20data%2E%20Static%20contexts%20will%20cause%20this%20to%20be%20called%20once%20per%0A%20%20%2F%2F%20%20%20element%3B%20Shiny%20apps%20will%20cause%20this%20to%20be%20called%20multiple%20times%20per%0A%20%20%2F%2F%20%20%20element%2C%20as%20the%20data%20changes%2E%0A%20%20window%2EHTMLWidgets%2Ewidget%20%3D%20function%28definition%29%20%7B%0A%20%20%20%20if%20%28%21definition%2Ename%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Widget%20must%20have%20a%20name%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28%21definition%2Etype%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Widget%20must%20have%20a%20type%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20Currently%20we%20only%20support%20output%20widgets%0A%20%20%20%20if%20%28definition%2Etype%20%21%3D%3D%20%22output%22%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Unrecognized%20widget%20type%20%27%22%20%2B%20definition%2Etype%20%2B%20%22%27%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20TODO%3A%20Verify%20that%20%2Ename%20is%20a%20valid%20CSS%20classname%0A%20%20%20%20if%20%28%21definition%2ErenderValue%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Widget%20must%20have%20a%20renderValue%20function%22%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20For%20static%20rendering%20%28non%2DShiny%29%2C%20use%20a%20simple%20widget%20registration%0A%20%20%20%20%2F%2F%20scheme%2E%20We%20also%20use%20this%20scheme%20for%20Shiny%20apps%2Fdocuments%20that%20also%0A%20%20%20%20%2F%2F%20contain%20static%20widgets%2E%0A%20%20%20%20window%2EHTMLWidgets%2Ewidgets%20%3D%20window%2EHTMLWidgets%2Ewidgets%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20%2F%2F%20Merge%20defaults%20into%20the%20definition%3B%20don%27t%20mutate%20the%20original%20definition%2E%0A%20%20%20%20var%20staticBinding%20%3D%20extend%28%7B%7D%2C%20defaults%2C%20definition%29%3B%0A%20%20%20%20overrideMethod%28staticBinding%2C%20%22find%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20return%20function%28scope%29%20%7B%0A%20%20%20%20%20%20%20%20var%20results%20%3D%20superfunc%28scope%29%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Filter%20out%20Shiny%20outputs%2C%20we%20only%20want%20the%20static%20kind%0A%20%20%20%20%20%20%20%20return%20filterByClass%28results%2C%20%22html%2Dwidget%2Doutput%22%2C%20false%29%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20window%2EHTMLWidgets%2Ewidgets%2Epush%28staticBinding%29%3B%0A%0A%20%20%20%20if%20%28shinyMode%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Shiny%20is%20running%2E%20Register%20the%20definition%20as%20an%20output%20binding%2E%0A%0A%20%20%20%20%20%20%2F%2F%20Merge%20defaults%20into%20the%20definition%3B%20don%27t%20mutate%20the%20original%20definition%2E%0A%20%20%20%20%20%20%2F%2F%20The%20base%20object%20is%20a%20Shiny%20output%20binding%20if%20we%27re%20running%20in%20Shiny%20mode%2C%0A%20%20%20%20%20%20%2F%2F%20or%20an%20empty%20object%20if%20we%27re%20not%2E%0A%20%20%20%20%20%20var%20shinyBinding%20%3D%20extend%28new%20Shiny%2EOutputBinding%28%29%2C%20defaults%2C%20definition%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Wrap%20renderValue%20to%20handle%20initialization%2C%20which%20unfortunately%20isn%27t%0A%20%20%20%20%20%20%2F%2F%20supported%20natively%20by%20Shiny%20at%20the%20time%20of%20this%20writing%2E%0A%0A%20%20%20%20%20%20%2F%2F%20NB%3A%20shinyBinding%2Einitialize%20may%20be%20undefined%2C%20as%20it%27s%20optional%2E%0A%0A%20%20%20%20%20%20%2F%2F%20Rename%20initialize%20to%20make%20sure%20it%20isn%27t%20called%20by%20a%20future%20version%0A%20%20%20%20%20%20%2F%2F%20of%20Shiny%20that%20does%20support%20initialize%20directly%2E%0A%20%20%20%20%20%20shinyBinding%2E%5Fhtmlwidgets%5Finitialize%20%3D%20shinyBinding%2Einitialize%3B%0A%20%20%20%20%20%20delete%20shinyBinding%2Einitialize%3B%0A%0A%20%20%20%20%20%20overrideMethod%28shinyBinding%2C%20%22find%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28scope%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20var%20results%20%3D%20superfunc%28scope%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Only%20return%20elements%20that%20are%20Shiny%20outputs%2C%20not%20static%20ones%0A%20%20%20%20%20%20%20%20%20%20var%20dynamicResults%20%3D%20results%2Efilter%28%22%2Ehtml%2Dwidget%2Doutput%22%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20It%27s%20possible%20that%20whatever%20caused%20Shiny%20to%20think%20there%20might%20be%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20new%20dynamic%20outputs%2C%20also%20caused%20there%20to%20be%20new%20static%20outputs%2E%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Since%20there%20might%20be%20lots%20of%20different%20htmlwidgets%20bindings%2C%20we%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20schedule%20execution%20for%20later%2D%2Dno%20need%20to%20staticRender%20multiple%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20times%2E%0A%20%20%20%20%20%20%20%20%20%20if%20%28results%2Elength%20%21%3D%3D%20dynamicResults%2Elength%29%0A%20%20%20%20%20%20%20%20%20%20%20%20scheduleStaticRender%28%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20return%20dynamicResults%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20overrideMethod%28shinyBinding%2C%20%22renderValue%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28el%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Resolve%20strings%20marked%20as%20javascript%20literals%20to%20objects%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21%28data%2Eevals%20instanceof%20Array%29%29%20data%2Eevals%20%3D%20%5Bdata%2Eevals%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%200%3B%20data%2Eevals%20%26%26%20i%20%3C%20data%2Eevals%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EevaluateStringMember%28data%2Ex%2C%20data%2Eevals%5Bi%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21this%2ErenderOnNullValue%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28data%2Ex%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%2Estyle%2Evisibility%20%3D%20%22hidden%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%2Estyle%2Evisibility%20%3D%20%22inherit%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21elementData%28el%2C%20%22initialized%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20initSizing%28el%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20elementData%28el%2C%20%22initialized%22%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28this%2E%5Fhtmlwidgets%5Finitialize%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20result%20%3D%20this%2E%5Fhtmlwidgets%5Finitialize%28el%2C%20el%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20el%2EoffsetHeight%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20elementData%28el%2C%20%22init%5Fresult%22%2C%20result%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20Shiny%2ErenderDependencies%28data%2Edeps%29%3B%0A%20%20%20%20%20%20%20%20%20%20superfunc%28el%2C%20data%2Ex%2C%20elementData%28el%2C%20%22init%5Fresult%22%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20overrideMethod%28shinyBinding%2C%20%22resize%22%2C%20function%28superfunc%29%20%7B%0A%20%20%20%20%20%20%20%20return%20function%28el%2C%20width%2C%20height%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Shiny%20can%20call%20resize%20before%20initialize%2FrenderValue%20have%20been%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20called%2C%20which%20doesn%27t%20make%20sense%20for%20widgets%2E%0A%20%20%20%20%20%20%20%20%20%20if%20%28elementData%28el%2C%20%22initialized%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20superfunc%28el%2C%20width%2C%20height%2C%20elementData%28el%2C%20%22init%5Fresult%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20%20%20Shiny%2EoutputBindings%2Eregister%28shinyBinding%2C%20shinyBinding%2Ename%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%0A%20%20var%20scheduleStaticRenderTimerId%20%3D%20null%3B%0A%20%20function%20scheduleStaticRender%28%29%20%7B%0A%20%20%20%20if%20%28%21scheduleStaticRenderTimerId%29%20%7B%0A%20%20%20%20%20%20scheduleStaticRenderTimerId%20%3D%20setTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20scheduleStaticRenderTimerId%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EstaticRender%28%29%3B%0A%20%20%20%20%20%20%7D%2C%201%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Render%20static%20widgets%20after%20the%20document%20finishes%20loading%0A%20%20%2F%2F%20Statically%20render%20all%20elements%20that%20are%20of%20this%20widget%27s%20class%0A%20%20window%2EHTMLWidgets%2EstaticRender%20%3D%20function%28%29%20%7B%0A%20%20%20%20var%20bindings%20%3D%20window%2EHTMLWidgets%2Ewidgets%20%7C%7C%20%5B%5D%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20bindings%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20binding%20%3D%20bindings%5Bi%5D%3B%0A%20%20%20%20%20%20var%20matches%20%3D%20binding%2Efind%28document%2EdocumentElement%29%3B%0A%20%20%20%20%20%20for%20%28var%20j%20%3D%200%3B%20j%20%3C%20matches%2Elength%3B%20j%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20var%20el%20%3D%20matches%5Bj%5D%3B%0A%20%20%20%20%20%20%20%20var%20sizeObj%20%3D%20initSizing%28el%2C%20binding%29%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28hasClass%28el%2C%20%22html%2Dwidget%2Dstatic%2Dbound%22%29%29%0A%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20el%2EclassName%20%3D%20el%2EclassName%20%2B%20%22%20html%2Dwidget%2Dstatic%2Dbound%22%3B%0A%0A%20%20%20%20%20%20%20%20var%20initResult%3B%0A%20%20%20%20%20%20%20%20if%20%28binding%2Einitialize%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20initResult%20%3D%20binding%2Einitialize%28el%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20sizeObj%20%3F%20sizeObj%2EgetWidth%28%29%20%3A%20el%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20sizeObj%20%3F%20sizeObj%2EgetHeight%28%29%20%3A%20el%2EoffsetHeight%0A%20%20%20%20%20%20%20%20%20%20%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28binding%2Eresize%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20lastSize%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20on%28window%2C%20%22resize%22%2C%20function%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20size%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20w%3A%20sizeObj%20%3F%20sizeObj%2EgetWidth%28%29%20%3A%20el%2EoffsetWidth%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20h%3A%20sizeObj%20%3F%20sizeObj%2EgetHeight%28%29%20%3A%20el%2EoffsetHeight%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28size%2Ew%20%3D%3D%3D%200%20%26%26%20size%2Eh%20%3D%3D%3D%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28size%2Ew%20%3D%3D%3D%20lastSize%2Ew%20%26%26%20size%2Eh%20%3D%3D%3D%20lastSize%2Eh%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20lastSize%20%3D%20size%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20binding%2Eresize%28el%2C%20size%2Ew%2C%20size%2Eh%2C%20initResult%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20var%20scriptData%20%3D%20document%2EquerySelector%28%22script%5Bdata%2Dfor%3D%27%22%20%2B%20el%2Eid%20%2B%20%22%27%5D%5Btype%3D%27application%2Fjson%27%5D%22%29%3B%0A%20%20%20%20%20%20%20%20if%20%28scriptData%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20data%20%3D%20JSON%2Eparse%28scriptData%2EtextContent%20%7C%7C%20scriptData%2Etext%29%3B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Resolve%20strings%20marked%20as%20javascript%20literals%20to%20objects%0A%20%20%20%20%20%20%20%20%20%20if%20%28%21%28data%2Eevals%20instanceof%20Array%29%29%20data%2Eevals%20%3D%20%5Bdata%2Eevals%5D%3B%0A%20%20%20%20%20%20%20%20%20%20for%20%28var%20k%20%3D%200%3B%20data%2Eevals%20%26%26%20k%20%3C%20data%2Eevals%2Elength%3B%20k%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EevaluateStringMember%28data%2Ex%2C%20data%2Eevals%5Bk%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20binding%2ErenderValue%28el%2C%20data%2Ex%2C%20initResult%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Wait%20until%20after%20the%20document%20has%20loaded%20to%20render%20the%20widgets%2E%0A%20%20if%20%28document%2EaddEventListener%29%20%7B%0A%20%20%20%20document%2EaddEventListener%28%22DOMContentLoaded%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20document%2EremoveEventListener%28%22DOMContentLoaded%22%2C%20arguments%2Ecallee%2C%20false%29%3B%0A%20%20%20%20%20%20window%2EHTMLWidgets%2EstaticRender%28%29%3B%0A%20%20%20%20%7D%2C%20false%29%3B%0A%20%20%7D%20else%20if%20%28document%2EattachEvent%29%20%7B%0A%20%20%20%20document%2EattachEvent%28%22onreadystatechange%22%2C%20function%28%29%20%7B%0A%20%20%20%20%20%20if%20%28document%2EreadyState%20%3D%3D%3D%20%22complete%22%29%20%7B%0A%20%20%20%20%20%20%20%20document%2EdetachEvent%28%22onreadystatechange%22%2C%20arguments%2Ecallee%29%3B%0A%20%20%20%20%20%20%20%20window%2EHTMLWidgets%2EstaticRender%28%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%29%3B%0A%20%20%7D%0A%0A%0A%20%20window%2EHTMLWidgets%2EgetAttachmentUrl%20%3D%20function%28depname%2C%20key%29%20%7B%0A%20%20%20%20%2F%2F%20If%20no%20key%2C%20default%20to%20the%20first%20item%0A%20%20%20%20if%20%28typeof%28key%29%20%3D%3D%3D%20%22undefined%22%29%0A%20%20%20%20%20%20key%20%3D%201%3B%0A%0A%20%20%20%20var%20link%20%3D%20document%2EgetElementById%28depname%20%2B%20%22%2D%22%20%2B%20key%20%2B%20%22%2Dattachment%22%29%3B%0A%20%20%20%20if%20%28%21link%29%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%22Attachment%20%22%20%2B%20depname%20%2B%20%22%2F%22%20%2B%20key%20%2B%20%22%20not%20found%20in%20document%22%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20link%2EgetAttribute%28%22href%22%29%3B%0A%20%20%7D%3B%0A%0A%20%20window%2EHTMLWidgets%2EdataframeToD3%20%3D%20function%28df%29%20%7B%0A%20%20%20%20var%20names%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20length%3B%0A%20%20%20%20for%20%28var%20name%20in%20df%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28df%2EhasOwnProperty%28name%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20names%2Epush%28name%29%3B%0A%20%20%20%20%20%20%20%20if%20%28typeof%28df%5Bname%5D%29%20%21%3D%3D%20%22object%22%20%7C%7C%20typeof%28df%5Bname%5D%2Elength%29%20%3D%3D%3D%20%22undefined%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%22All%20fields%20must%20be%20arrays%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28typeof%28length%29%20%21%3D%3D%20%22undefined%22%20%26%26%20length%20%21%3D%3D%20df%5Bname%5D%2Elength%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%22All%20fields%20must%20be%20arrays%20of%20the%20same%20length%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20length%20%3D%20df%5Bname%5D%2Elength%3B%0A%20%20%20%20%7D%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20item%3B%0A%20%20%20%20for%20%28var%20row%20%3D%200%3B%20row%20%3C%20length%3B%20row%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20item%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20for%20%28var%20col%20%3D%200%3B%20col%20%3C%20names%2Elength%3B%20col%2B%2B%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20item%5Bnames%5Bcol%5D%5D%20%3D%20df%5Bnames%5Bcol%5D%5D%5Brow%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20results%2Epush%28item%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%3B%0A%0A%20%20window%2EHTMLWidgets%2EtransposeArray2D%20%3D%20function%28array%29%20%7B%0A%20%20%20%20%20%20var%20newArray%20%3D%20array%5B0%5D%2Emap%28function%28col%2C%20i%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20return%20array%2Emap%28function%28row%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20row%5Bi%5D%0A%20%20%20%20%20%20%20%20%20%20%7D%29%0A%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20return%20newArray%3B%0A%20%20%7D%3B%0A%20%20%2F%2F%20Split%20value%20at%20splitChar%2C%20but%20allow%20splitChar%20to%20be%20escaped%0A%20%20%2F%2F%20using%20escapeChar%2E%20Any%20other%20characters%20escaped%20by%20escapeChar%0A%20%20%2F%2F%20will%20be%20included%20as%20usual%20%28including%20escapeChar%20itself%29%2E%0A%20%20function%20splitWithEscape%28value%2C%20splitChar%2C%20escapeChar%29%20%7B%0A%20%20%20%20var%20results%20%3D%20%5B%5D%3B%0A%20%20%20%20var%20escapeMode%20%3D%20false%3B%0A%20%20%20%20var%20currentResult%20%3D%20%22%22%3B%0A%20%20%20%20for%20%28var%20pos%20%3D%200%3B%20pos%20%3C%20value%2Elength%3B%20pos%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28%21escapeMode%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28value%5Bpos%5D%20%3D%3D%3D%20splitChar%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20results%2Epush%28currentResult%29%3B%0A%20%20%20%20%20%20%20%20%20%20currentResult%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28value%5Bpos%5D%20%3D%3D%3D%20escapeChar%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20escapeMode%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20currentResult%20%2B%3D%20value%5Bpos%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20currentResult%20%2B%3D%20value%5Bpos%5D%3B%0A%20%20%20%20%20%20%20%20escapeMode%20%3D%20false%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20if%20%28currentResult%20%21%3D%3D%20%22%22%29%20%7B%0A%20%20%20%20%20%20results%2Epush%28currentResult%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20results%3B%0A%20%20%7D%0A%20%20%2F%2F%20Function%20authored%20by%20Yihui%2FJJ%20Allaire%0A%20%20window%2EHTMLWidgets%2EevaluateStringMember%20%3D%20function%28o%2C%20member%29%20%7B%0A%20%20%20%20var%20parts%20%3D%20splitWithEscape%28member%2C%20%27%2E%27%2C%20%27%5C%5C%27%29%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%2C%20l%20%3D%20parts%2Elength%3B%20i%20%3C%20l%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20part%20%3D%20parts%5Bi%5D%3B%0A%20%20%20%20%20%20%2F%2F%20part%20may%20be%20a%20character%20or%20%27numeric%27%20member%20name%0A%20%20%20%20%20%20if%20%28o%20%21%3D%3D%20null%20%26%26%20typeof%20o%20%3D%3D%3D%20%22object%22%20%26%26%20part%20in%20o%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28i%20%3D%3D%20%28l%20%2D%201%29%29%20%7B%20%2F%2F%20if%20we%20are%20at%20the%20end%20of%20the%20line%20then%20evalulate%0A%20%20%20%20%20%20%20%20%20%20if%20%28typeof%20o%5Bpart%5D%20%3D%3D%3D%20%22string%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20o%5Bpart%5D%20%3D%20eval%28%22%28%22%20%2B%20o%5Bpart%5D%20%2B%20%22%29%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%20%2F%2F%20otherwise%20continue%20to%20next%20embedded%20object%0A%20%20%20%20%20%20%20%20%20%20o%20%3D%20o%5Bpart%5D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%3B%0A%7D%29%28%29%3B%0A%0A"></script>
<script src="data:application/x-javascript,%2F%2F%20svg%2Dpan%2Dzoom%20v3%2E1%2E0%0A%2F%2F%20https%3A%2F%2Fgithub%2Ecom%2Fariutta%2Fsvg%2Dpan%2Dzoom%0A%28function%20e%28t%2Cn%2Cr%29%7Bfunction%20s%28o%2Cu%29%7Bif%28%21n%5Bo%5D%29%7Bif%28%21t%5Bo%5D%29%7Bvar%20a%3Dtypeof%20require%3D%3D%22function%22%26%26require%3Bif%28%21u%26%26a%29return%20a%28o%2C%210%29%3Bif%28i%29return%20i%28o%2C%210%29%3Bvar%20f%3Dnew%20Error%28%22Cannot%20find%20module%20%27%22%2Bo%2B%22%27%22%29%3Bthrow%20f%2Ecode%3D%22MODULE%5FNOT%5FFOUND%22%2Cf%7Dvar%20l%3Dn%5Bo%5D%3D%7Bexports%3A%7B%7D%7D%3Bt%5Bo%5D%5B0%5D%2Ecall%28l%2Eexports%2Cfunction%28e%29%7Bvar%20n%3Dt%5Bo%5D%5B1%5D%5Be%5D%3Breturn%20s%28n%3Fn%3Ae%29%7D%2Cl%2Cl%2Eexports%2Ce%2Ct%2Cn%2Cr%29%7Dreturn%20n%5Bo%5D%2Eexports%7Dvar%20i%3Dtypeof%20require%3D%3D%22function%22%26%26require%3Bfor%28var%20o%3D0%3Bo%3Cr%2Elength%3Bo%2B%2B%29s%28r%5Bo%5D%29%3Breturn%20s%7D%29%28%7B1%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0Avar%20svgPanZoom%20%3D%20require%28%27%2E%2Fsvg%2Dpan%2Dzoom%2Ejs%27%29%3B%0A%0A%2F%2F%20UMD%20module%20definition%0A%28function%28window%2C%20document%29%7B%0A%20%20%2F%2F%20AMD%0A%20%20if%20%28typeof%20define%20%3D%3D%3D%20%27function%27%20%26%26%20define%2Eamd%29%20%7B%0A%20%20%20%20define%28%27svg%2Dpan%2Dzoom%27%2C%20function%20%28%29%20%7B%0A%20%20%20%20%20%20return%20svgPanZoom%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%2F%2F%20CMD%0A%20%20%7D%20else%20if%20%28typeof%20module%20%21%3D%3D%20%27undefined%27%20%26%26%20module%2Eexports%29%20%7B%0A%20%20%20%20module%2Eexports%20%3D%20svgPanZoom%3B%0A%0A%20%20%20%20%2F%2F%20Browser%0A%20%20%20%20%2F%2F%20Keep%20exporting%20globally%20as%20module%2Eexports%20is%20available%20because%20of%20browserify%0A%20%20%20%20window%2EsvgPanZoom%20%3D%20svgPanZoom%3B%0A%20%20%7D%0A%7D%29%28window%2C%20document%29%0A%0A%7D%2C%7B%22%2E%2Fsvg%2Dpan%2Dzoom%2Ejs%22%3A5%7D%5D%2C2%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0A%28function%28factory%29%7B%0A%20%20if%20%28%20typeof%20define%20%3D%3D%3D%20%27function%27%20%26%26%20define%2Eamd%20%29%20%7B%0A%20%20%20%20%2F%2F%20AMD%2E%20Register%20as%20an%20anonymous%20module%2E%0A%20%20%20%20define%28%5B%5D%2C%20factory%28%29%29%3B%0A%20%20%7D%20else%20if%20%28typeof%20exports%20%3D%3D%3D%20%27object%27%29%20%7B%0A%20%20%20%20%2F%2F%20Node%2FCommonJS%0A%20%20%20%20module%2Eexports%20%3D%20factory%28%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20%2F%2F%20Browser%20globals%0A%20%20%20%20window%2Ewheel%20%3D%20factory%28%29%3B%0A%20%20%7D%0A%7D%0A%28function%28%29%7B%0A%0A%20%20%2F%2FFull%20details%3A%20https%3A%2F%2Fdeveloper%2Emozilla%2Eorg%2Fen%2DUS%2Fdocs%2FWeb%2FReference%2FEvents%2Fwheel%0A%0A%20%20var%20prefix%20%3D%20%22%22%2C%20%5FaddEventListener%2C%20%5FremoveEventListener%2C%20onwheel%2C%20support%2C%20fns%20%3D%20%5B%5D%3B%0A%0A%20%20%2F%2F%20detect%20event%20model%0A%20%20if%20%28%20window%2EaddEventListener%20%29%20%7B%0A%20%20%20%20%5FaddEventListener%20%3D%20%22addEventListener%22%3B%0A%20%20%20%20%5FremoveEventListener%20%3D%20%22removeEventListener%22%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20%5FaddEventListener%20%3D%20%22attachEvent%22%3B%0A%20%20%20%20%5FremoveEventListener%20%3D%20%22detachEvent%22%3B%0A%20%20%20%20prefix%20%3D%20%22on%22%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20detect%20available%20wheel%20event%0A%20%20support%20%3D%20%22onwheel%22%20in%20document%2EcreateElement%28%22div%22%29%20%3F%20%22wheel%22%20%3A%20%2F%2F%20Modern%20browsers%20support%20%22wheel%22%0A%20%20%20%20%20%20%20%20%20%20%20%20document%2Eonmousewheel%20%21%3D%3D%20undefined%20%3F%20%22mousewheel%22%20%3A%20%2F%2F%20Webkit%20and%20IE%20support%20at%20least%20%22mousewheel%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%22DOMMouseScroll%22%3B%20%2F%2F%20let%27s%20assume%20that%20remaining%20browsers%20are%20older%20Firefox%0A%0A%0A%20%20function%20createCallback%28element%2Ccallback%2Ccapture%29%20%7B%0A%0A%20%20%20%20var%20fn%20%3D%20function%28originalEvent%29%20%7B%0A%0A%20%20%20%20%20%20%21originalEvent%20%26%26%20%28%20originalEvent%20%3D%20window%2Eevent%20%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20create%20a%20normalized%20event%20object%0A%20%20%20%20%20%20var%20event%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20keep%20a%20ref%20to%20the%20original%20event%20object%0A%20%20%20%20%20%20%20%20originalEvent%3A%20originalEvent%2C%0A%20%20%20%20%20%20%20%20target%3A%20originalEvent%2Etarget%20%7C%7C%20originalEvent%2EsrcElement%2C%0A%20%20%20%20%20%20%20%20type%3A%20%22wheel%22%2C%0A%20%20%20%20%20%20%20%20deltaMode%3A%20originalEvent%2Etype%20%3D%3D%20%22MozMousePixelScroll%22%20%3F%200%20%3A%201%2C%0A%20%20%20%20%20%20%20%20deltaX%3A%200%2C%0A%20%20%20%20%20%20%20%20delatZ%3A%200%2C%0A%20%20%20%20%20%20%20%20preventDefault%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20originalEvent%2EpreventDefault%20%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20originalEvent%2EpreventDefault%28%29%20%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20originalEvent%2EreturnValue%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%2F%2F%20calculate%20deltaY%20%28and%20deltaX%29%20according%20to%20the%20event%0A%20%20%20%20%20%20if%20%28%20support%20%3D%3D%20%22mousewheel%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20event%2EdeltaY%20%3D%20%2D%201%2F40%20%2A%20originalEvent%2EwheelDelta%3B%0A%20%20%20%20%20%20%20%20%2F%2F%20Webkit%20also%20support%20wheelDeltaX%0A%20%20%20%20%20%20%20%20originalEvent%2EwheelDeltaX%20%26%26%20%28%20event%2EdeltaX%20%3D%20%2D%201%2F40%20%2A%20originalEvent%2EwheelDeltaX%20%29%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20event%2EdeltaY%20%3D%20originalEvent%2Edetail%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20it%27s%20time%20to%20fire%20the%20callback%0A%20%20%20%20%20%20return%20callback%28%20event%20%29%3B%0A%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20fns%2Epush%28%7B%0A%20%20%20%20%20%20element%3A%20element%2C%0A%20%20%20%20%20%20fn%3A%20fn%2C%0A%20%20%20%20%20%20capture%3A%20capture%0A%20%20%20%20%7D%29%3B%0A%0A%20%20%20%20return%20fn%3B%0A%20%20%7D%0A%0A%20%20function%20getCallback%28element%2Ccapture%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20fns%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28fns%5Bi%5D%2Eelement%20%3D%3D%3D%20element%20%26%26%20fns%5Bi%5D%2Ecapture%20%3D%3D%3D%20capture%29%20%7B%0A%20%20%20%20%20%20%20%20return%20fns%5Bi%5D%2Efn%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20function%28%29%7B%7D%3B%0A%20%20%7D%0A%0A%20%20function%20removeCallback%28element%2Ccapture%29%20%7B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20fns%2Elength%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20if%20%28fns%5Bi%5D%2Eelement%20%3D%3D%3D%20element%20%26%26%20fns%5Bi%5D%2Ecapture%20%3D%3D%3D%20capture%29%20%7B%0A%20%20%20%20%20%20%20%20return%20fns%2Esplice%28i%2C1%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20%5FaddWheelListener%28%20elem%2C%20eventName%2C%20callback%2C%20useCapture%20%29%20%7B%0A%20%20%20%20%0A%20%20%20%20var%20cb%3B%0A%0A%20%20%20%20if%20%28support%20%3D%3D%3D%20%22wheel%22%29%20%7B%0A%20%20%20%20%20%20cb%20%3D%20callback%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20cb%20%3D%20createCallback%28elem%2Ccallback%2CuseCapture%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20elem%5B%20%5FaddEventListener%20%5D%28%20prefix%20%2B%20eventName%2C%20cb%2C%20useCapture%20%7C%7C%20false%20%29%3B%0A%0A%20%20%7D%0A%0A%20%20function%20%5FremoveWheelListener%28%20elem%2C%20eventName%2C%20callback%2C%20useCapture%20%29%20%7B%0A%0A%20%20%20%20if%20%28support%20%3D%3D%3D%20%22wheel%22%29%20%7B%0A%20%20%20%20%20%20cb%20%3D%20callback%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20cb%20%3D%20getCallback%28elem%2CuseCapture%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20elem%5B%20%5FremoveEventListener%20%5D%28%20prefix%20%2B%20eventName%2C%20cb%2C%20useCapture%20%7C%7C%20false%20%29%3B%0A%0A%20%20%20%20removeCallback%28elem%2CuseCapture%29%3B%0A%0A%20%20%7D%0A%0A%20%20function%20addWheelListener%28%20elem%2C%20callback%2C%20useCapture%20%29%20%7B%0A%20%20%20%20%5FaddWheelListener%28%20elem%2C%20support%2C%20callback%2C%20useCapture%20%29%3B%0A%0A%20%20%20%20%2F%2F%20handle%20MozMousePixelScroll%20in%20older%20Firefox%0A%20%20%20%20if%28%20support%20%3D%3D%20%22DOMMouseScroll%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%5FaddWheelListener%28%20elem%2C%20%22MozMousePixelScroll%22%2C%20callback%2C%20useCapture%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20function%20removeWheelListener%28elem%2Ccallback%2CuseCapture%29%7B%0A%20%20%20%20%5FremoveWheelListener%28elem%2Csupport%2Ccallback%2CuseCapture%29%3B%0A%0A%20%20%20%20%2F%2F%20handle%20MozMousePixelScroll%20in%20older%20Firefox%0A%20%20%20%20if%28%20support%20%3D%3D%20%22DOMMouseScroll%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%5FremoveWheelListener%28elem%2C%20%22MozMousePixelScroll%22%2C%20callback%2C%20useCapture%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20return%20%7B%0A%20%20%20%20on%3A%20addWheelListener%2C%0A%20%20%20%20off%3A%20removeWheelListener%0A%20%20%7D%3B%0A%0A%7D%29%29%3B%0A%7D%2C%7B%7D%5D%2C3%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0Avar%20SvgUtils%20%3D%20require%28%27%2E%2Fsvg%2Dutilities%27%29%3B%0A%0Amodule%2Eexports%20%3D%20%7B%0A%20%20enable%3A%20function%28instance%29%20%7B%0A%20%20%20%20%2F%2F%20Select%20%28and%20create%20if%20necessary%29%20defs%0A%20%20%20%20var%20defs%20%3D%20instance%2Esvg%2EquerySelector%28%27defs%27%29%0A%20%20%20%20if%20%28%21defs%29%20%7B%0A%20%20%20%20%20%20defs%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27defs%27%29%0A%20%20%20%20%20%20instance%2Esvg%2EappendChild%28defs%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Create%20style%20element%0A%20%20%20%20var%20style%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27style%27%29%0A%20%20%20%20style%2EsetAttribute%28%27type%27%2C%20%27text%2Fcss%27%29%0A%20%20%20%20style%2EtextContent%20%3D%20%27%2Esvg%2Dpan%2Dzoom%2Dcontrol%20%7B%20cursor%3A%20pointer%3B%20fill%3A%20black%3B%20fill%2Dopacity%3A%200%2E333%3B%20%7D%20%2Esvg%2Dpan%2Dzoom%2Dcontrol%3Ahover%20%7B%20fill%2Dopacity%3A%200%2E8%3B%20%7D%20%2Esvg%2Dpan%2Dzoom%2Dcontrol%2Dbackground%20%7B%20fill%3A%20white%3B%20fill%2Dopacity%3A%200%2E5%3B%20%7D%20%2Esvg%2Dpan%2Dzoom%2Dcontrol%2Dbackground%20%7B%20fill%2Dopacity%3A%200%2E8%3B%20%7D%27%0A%20%20%20%20defs%2EappendChild%28style%29%0A%0A%0A%20%20%20%20%2F%2F%20Zoom%20Group%0A%20%20%20%20var%20zoomGroup%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27g%27%29%3B%0A%20%20%20%20zoomGroup%2EsetAttribute%28%27id%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrols%27%29%3B%0A%20%20%20%20zoomGroup%2EsetAttribute%28%27transform%27%2C%20%27translate%28%27%20%2B%20%28%20instance%2Ewidth%20%2D%2070%20%29%20%2B%20%27%20%27%20%2B%20%28%20instance%2Eheight%20%2D%2076%20%29%20%2B%20%27%29%20scale%280%2E75%29%27%29%3B%0A%20%20%20%20zoomGroup%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%27%29%3B%0A%0A%20%20%20%20%2F%2F%20Control%20elements%0A%20%20%20%20zoomGroup%2EappendChild%28this%2E%5FcreateZoomIn%28instance%29%29%0A%20%20%20%20zoomGroup%2EappendChild%28this%2E%5FcreateZoomReset%28instance%29%29%0A%20%20%20%20zoomGroup%2EappendChild%28this%2E%5FcreateZoomOut%28instance%29%29%0A%0A%20%20%20%20%2F%2F%20Finally%20append%20created%20element%0A%20%20%20%20instance%2Esvg%2EappendChild%28zoomGroup%29%0A%0A%20%20%20%20%2F%2F%20Cache%20control%20instance%0A%20%20%20%20instance%2EcontrolIcons%20%3D%20zoomGroup%0A%20%20%7D%0A%0A%2C%20%5FcreateZoomIn%3A%20function%28instance%29%20%7B%0A%20%20%20%20var%20zoomIn%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27g%27%29%3B%0A%20%20%20%20zoomIn%2EsetAttribute%28%27id%27%2C%20%27svg%2Dpan%2Dzoom%2Dzoom%2Din%27%29%3B%0A%20%20%20%20zoomIn%2EsetAttribute%28%27transform%27%2C%20%27translate%2830%2E5%205%29%20scale%280%2E015%29%27%29%3B%0A%20%20%20%20zoomIn%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%27%29%3B%0A%20%20%20%20zoomIn%2EaddEventListener%28%27click%27%2C%20function%28%29%20%7Binstance%2EgetPublicInstance%28%29%2EzoomIn%28%29%7D%2C%20false%29%0A%20%20%20%20zoomIn%2EaddEventListener%28%27touchstart%27%2C%20function%28%29%20%7Binstance%2EgetPublicInstance%28%29%2EzoomIn%28%29%7D%2C%20false%29%0A%0A%20%20%20%20var%20zoomInBackground%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27rect%27%29%3B%20%2F%2F%20TODO%20change%20these%20background%20space%20fillers%20to%20rounded%20rectangles%20so%20they%20look%20prettier%0A%20%20%20%20zoomInBackground%2EsetAttribute%28%27x%27%2C%20%270%27%29%3B%0A%20%20%20%20zoomInBackground%2EsetAttribute%28%27y%27%2C%20%270%27%29%3B%0A%20%20%20%20zoomInBackground%2EsetAttribute%28%27width%27%2C%20%271500%27%29%3B%20%2F%2F%20larger%20than%20expected%20because%20the%20whole%20group%20is%20transformed%20to%20scale%20down%0A%20%20%20%20zoomInBackground%2EsetAttribute%28%27height%27%2C%20%271400%27%29%3B%0A%20%20%20%20zoomInBackground%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Dbackground%27%29%3B%0A%20%20%20%20zoomIn%2EappendChild%28zoomInBackground%29%3B%0A%0A%20%20%20%20var%20zoomInShape%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27path%27%29%3B%0A%20%20%20%20zoomInShape%2EsetAttribute%28%27d%27%2C%20%27M1280%20576v128q0%2026%20%2D19%2045t%2D45%2019h%2D320v320q0%2026%20%2D19%2045t%2D45%2019h%2D128q%2D26%200%20%2D45%20%2D19t%2D19%20%2D45v%2D320h%2D320q%2D26%200%20%2D45%20%2D19t%2D19%20%2D45v%2D128q0%20%2D26%2019%20%2D45t45%20%2D19h320v%2D320q0%20%2D26%2019%20%2D45t45%20%2D19h128q26%200%2045%2019t19%2045v320h320q26%200%2045%2019t19%2045zM1536%201120v%2D960%20q0%20%2D119%20%2D84%2E5%20%2D203%2E5t%2D203%2E5%20%2D84%2E5h%2D960q%2D119%200%20%2D203%2E5%2084%2E5t%2D84%2E5%20203%2E5v960q0%20119%2084%2E5%20203%2E5t203%2E5%2084%2E5h960q119%200%20203%2E5%20%2D84%2E5t84%2E5%20%2D203%2E5z%27%29%3B%0A%20%20%20%20zoomInShape%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Delement%27%29%3B%0A%20%20%20%20zoomIn%2EappendChild%28zoomInShape%29%3B%0A%0A%20%20%20%20return%20zoomIn%0A%20%20%7D%0A%0A%2C%20%5FcreateZoomReset%3A%20function%28instance%29%7B%0A%20%20%20%20%2F%2F%20reset%0A%20%20%20%20var%20resetPanZoomControl%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27g%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EsetAttribute%28%27id%27%2C%20%27svg%2Dpan%2Dzoom%2Dreset%2Dpan%2Dzoom%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EsetAttribute%28%27transform%27%2C%20%27translate%285%2035%29%20scale%280%2E4%29%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EaddEventListener%28%27click%27%2C%20function%28%29%20%7Binstance%2EgetPublicInstance%28%29%2Ereset%28%29%7D%2C%20false%29%3B%0A%20%20%20%20resetPanZoomControl%2EaddEventListener%28%27touchstart%27%2C%20function%28%29%20%7Binstance%2EgetPublicInstance%28%29%2Ereset%28%29%7D%2C%20false%29%3B%0A%0A%20%20%20%20var%20resetPanZoomControlBackground%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27rect%27%29%3B%20%2F%2F%20TODO%20change%20these%20background%20space%20fillers%20to%20rounded%20rectangles%20so%20they%20look%20prettier%0A%20%20%20%20resetPanZoomControlBackground%2EsetAttribute%28%27x%27%2C%20%272%27%29%3B%0A%20%20%20%20resetPanZoomControlBackground%2EsetAttribute%28%27y%27%2C%20%272%27%29%3B%0A%20%20%20%20resetPanZoomControlBackground%2EsetAttribute%28%27width%27%2C%20%27182%27%29%3B%20%2F%2F%20larger%20than%20expected%20because%20the%20whole%20group%20is%20transformed%20to%20scale%20down%0A%20%20%20%20resetPanZoomControlBackground%2EsetAttribute%28%27height%27%2C%20%2758%27%29%3B%0A%20%20%20%20resetPanZoomControlBackground%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Dbackground%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EappendChild%28resetPanZoomControlBackground%29%3B%0A%0A%20%20%20%20var%20resetPanZoomControlShape1%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27path%27%29%3B%0A%20%20%20%20resetPanZoomControlShape1%2EsetAttribute%28%27d%27%2C%20%27M33%2E051%2C20%2E632c%2D0%2E742%2D0%2E406%2D1%2E854%2D0%2E609%2D3%2E338%2D0%2E609h%2D7%2E969v9%2E281h7%2E769c1%2E543%2C0%2C2%2E701%2D0%2E188%2C3%2E473%2D0%2E562c1%2E365%2D0%2E656%2C2%2E048%2D1%2E953%2C2%2E048%2D3%2E891C35%2E032%2C22%2E757%2C34%2E372%2C21%2E351%2C33%2E051%2C20%2E632z%27%29%3B%0A%20%20%20%20resetPanZoomControlShape1%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Delement%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EappendChild%28resetPanZoomControlShape1%29%3B%0A%0A%20%20%20%20var%20resetPanZoomControlShape2%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27path%27%29%3B%0A%20%20%20%20resetPanZoomControlShape2%2EsetAttribute%28%27d%27%2C%20%27M170%2E231%2C0%2E5H15%2E847C7%2E102%2C0%2E5%2C0%2E5%2C5%2E708%2C0%2E5%2C11%2E84v38%2E861C0%2E5%2C56%2E833%2C7%2E102%2C61%2E5%2C15%2E847%2C61%2E5h154%2E384c8%2E745%2C0%2C15%2E269%2D4%2E667%2C15%2E269%2D10%2E798V11%2E84C185%2E5%2C5%2E708%2C178%2E976%2C0%2E5%2C170%2E231%2C0%2E5z%20M42%2E837%2C48%2E569h%2D7%2E969c%2D0%2E219%2D0%2E766%2D0%2E375%2D1%2E383%2D0%2E469%2D1%2E852c%2D0%2E188%2D0%2E969%2D0%2E289%2D1%2E961%2D0%2E305%2D2%2E977l%2D0%2E047%2D3%2E211c%2D0%2E03%2D2%2E203%2D0%2E41%2D3%2E672%2D1%2E142%2D4%2E406c%2D0%2E732%2D0%2E734%2D2%2E103%2D1%2E102%2D4%2E113%2D1%2E102h%2D7%2E05v13%2E547h%2D7%2E055V14%2E022h16%2E524c2%2E361%2C0%2E047%2C4%2E178%2C0%2E344%2C5%2E45%2C0%2E891c1%2E272%2C0%2E547%2C2%2E351%2C1%2E352%2C3%2E234%2C2%2E414c0%2E731%2C0%2E875%2C1%2E31%2C1%2E844%2C1%2E737%2C2%2E906s0%2E64%2C2%2E273%2C0%2E64%2C3%2E633c0%2C1%2E641%2D0%2E414%2C3%2E254%2D1%2E242%2C4%2E84s%2D2%2E195%2C2%2E707%2D4%2E102%2C3%2E363c1%2E594%2C0%2E641%2C2%2E723%2C1%2E551%2C3%2E387%2C2%2E73s0%2E996%2C2%2E98%2C0%2E996%2C5%2E402v2%2E32c0%2C1%2E578%2C0%2E063%2C2%2E648%2C0%2E19%2C3%2E211c0%2E19%2C0%2E891%2C0%2E635%2C1%2E547%2C1%2E333%2C1%2E969V48%2E569z%20M75%2E579%2C48%2E569h%2D26%2E18V14%2E022h25%2E336v6%2E117H56%2E454v7%2E336h16%2E781v6H56%2E454v8%2E883h19%2E125V48%2E569z%20M104%2E497%2C46%2E331c%2D2%2E44%2C2%2E086%2D5%2E887%2C3%2E129%2D10%2E34%2C3%2E129c%2D4%2E548%2C0%2D8%2E125%2D1%2E027%2D10%2E731%2D3%2E082s%2D3%2E909%2D4%2E879%2D3%2E909%2D8%2E473h6%2E891c0%2E224%2C1%2E578%2C0%2E662%2C2%2E758%2C1%2E316%2C3%2E539c1%2E196%2C1%2E422%2C3%2E246%2C2%2E133%2C6%2E15%2C2%2E133c1%2E739%2C0%2C3%2E151%2D0%2E188%2C4%2E236%2D0%2E562c2%2E058%2D0%2E719%2C3%2E087%2D2%2E055%2C3%2E087%2D4%2E008c0%2D1%2E141%2D0%2E504%2D2%2E023%2D1%2E512%2D2%2E648c%2D1%2E008%2D0%2E609%2D2%2E607%2D1%2E148%2D4%2E796%2D1%2E617l%2D3%2E74%2D0%2E82c%2D3%2E676%2D0%2E812%2D6%2E201%2D1%2E695%2D7%2E576%2D2%2E648c%2D2%2E328%2D1%2E594%2D3%2E492%2D4%2E086%2D3%2E492%2D7%2E477c0%2D3%2E094%2C1%2E139%2D5%2E664%2C3%2E417%2D7%2E711s5%2E623%2D3%2E07%2C10%2E036%2D3%2E07c3%2E685%2C0%2C6%2E829%2C0%2E965%2C9%2E431%2C2%2E895c2%2E602%2C1%2E93%2C3%2E966%2C4%2E73%2C4%2E093%2C8%2E402h%2D6%2E938c%2D0%2E128%2D2%2E078%2D1%2E057%2D3%2E555%2D2%2E787%2D4%2E43c%2D1%2E154%2D0%2E578%2D2%2E587%2D0%2E867%2D4%2E301%2D0%2E867c%2D1%2E907%2C0%2D3%2E428%2C0%2E375%2D4%2E565%2C1%2E125c%2D1%2E138%2C0%2E75%2D1%2E706%2C1%2E797%2D1%2E706%2C3%2E141c0%2C1%2E234%2C0%2E561%2C2%2E156%2C1%2E682%2C2%2E766c0%2E721%2C0%2E406%2C2%2E25%2C0%2E883%2C4%2E589%2C1%2E43l6%2E063%2C1%2E43c2%2E657%2C0%2E625%2C4%2E648%2C1%2E461%2C5%2E975%2C2%2E508c2%2E059%2C1%2E625%2C3%2E089%2C3%2E977%2C3%2E089%2C7%2E055C108%2E157%2C41%2E624%2C106%2E937%2C44%2E245%2C104%2E497%2C46%2E331z%20M139%2E61%2C48%2E569h%2D26%2E18V14%2E022h25%2E336v6%2E117h%2D18%2E281v7%2E336h16%2E781v6h%2D16%2E781v8%2E883h19%2E125V48%2E569z%20M170%2E337%2C20%2E14h%2D10%2E336v28%2E43h%2D7%2E266V20%2E14h%2D10%2E383v%2D6%2E117h27%2E984V20%2E14z%27%29%3B%0A%20%20%20%20resetPanZoomControlShape2%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Delement%27%29%3B%0A%20%20%20%20resetPanZoomControl%2EappendChild%28resetPanZoomControlShape2%29%3B%0A%0A%20%20%20%20return%20resetPanZoomControl%0A%20%20%7D%0A%0A%2C%20%5FcreateZoomOut%3A%20function%28instance%29%7B%0A%20%20%20%20%2F%2F%20zoom%20out%0A%20%20%20%20var%20zoomOut%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27g%27%29%3B%0A%20%20%20%20zoomOut%2EsetAttribute%28%27id%27%2C%20%27svg%2Dpan%2Dzoom%2Dzoom%2Dout%27%29%3B%0A%20%20%20%20zoomOut%2EsetAttribute%28%27transform%27%2C%20%27translate%2830%2E5%2070%29%20scale%280%2E015%29%27%29%3B%0A%20%20%20%20zoomOut%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%27%29%3B%0A%20%20%20%20zoomOut%2EaddEventListener%28%27click%27%2C%20function%28%29%20%7Binstance%2EgetPublicInstance%28%29%2EzoomOut%28%29%7D%2C%20false%29%3B%0A%20%20%20%20zoomOut%2EaddEventListener%28%27touchstart%27%2C%20function%28%29%20%7Binstance%2EgetPublicInstance%28%29%2EzoomOut%28%29%7D%2C%20false%29%3B%0A%0A%20%20%20%20var%20zoomOutBackground%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27rect%27%29%3B%20%2F%2F%20TODO%20change%20these%20background%20space%20fillers%20to%20rounded%20rectangles%20so%20they%20look%20prettier%0A%20%20%20%20zoomOutBackground%2EsetAttribute%28%27x%27%2C%20%270%27%29%3B%0A%20%20%20%20zoomOutBackground%2EsetAttribute%28%27y%27%2C%20%270%27%29%3B%0A%20%20%20%20zoomOutBackground%2EsetAttribute%28%27width%27%2C%20%271500%27%29%3B%20%2F%2F%20larger%20than%20expected%20because%20the%20whole%20group%20is%20transformed%20to%20scale%20down%0A%20%20%20%20zoomOutBackground%2EsetAttribute%28%27height%27%2C%20%271400%27%29%3B%0A%20%20%20%20zoomOutBackground%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Dbackground%27%29%3B%0A%20%20%20%20zoomOut%2EappendChild%28zoomOutBackground%29%3B%0A%0A%20%20%20%20var%20zoomOutShape%20%3D%20document%2EcreateElementNS%28SvgUtils%2EsvgNS%2C%20%27path%27%29%3B%0A%20%20%20%20zoomOutShape%2EsetAttribute%28%27d%27%2C%20%27M1280%20576v128q0%2026%20%2D19%2045t%2D45%2019h%2D896q%2D26%200%20%2D45%20%2D19t%2D19%20%2D45v%2D128q0%20%2D26%2019%20%2D45t45%20%2D19h896q26%200%2045%2019t19%2045zM1536%201120v%2D960q0%20%2D119%20%2D84%2E5%20%2D203%2E5t%2D203%2E5%20%2D84%2E5h%2D960q%2D119%200%20%2D203%2E5%2084%2E5t%2D84%2E5%20203%2E5v960q0%20119%2084%2E5%20203%2E5t203%2E5%2084%2E5h960q119%200%20203%2E5%20%2D84%2E5%20t84%2E5%20%2D203%2E5z%27%29%3B%0A%20%20%20%20zoomOutShape%2EsetAttribute%28%27class%27%2C%20%27svg%2Dpan%2Dzoom%2Dcontrol%2Delement%27%29%3B%0A%20%20%20%20zoomOut%2EappendChild%28zoomOutShape%29%3B%0A%0A%20%20%20%20return%20zoomOut%0A%20%20%7D%0A%0A%2C%20disable%3A%20function%28instance%29%20%7B%0A%20%20%20%20if%20%28instance%2EcontrolIcons%29%20%7B%0A%20%20%20%20%20%20instance%2EcontrolIcons%2EparentNode%2EremoveChild%28instance%2EcontrolIcons%29%0A%20%20%20%20%20%20instance%2EcontrolIcons%20%3D%20null%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0A%7D%2C%7B%22%2E%2Fsvg%2Dutilities%22%3A6%7D%5D%2C4%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0Avar%20SvgUtils%20%3D%20require%28%27%2E%2Fsvg%2Dutilities%27%29%0A%20%20%2C%20Utils%20%3D%20require%28%27%2E%2Futilities%27%29%0A%20%20%3B%0A%0Avar%20ShadowViewport%20%3D%20function%28viewport%2C%20options%29%7B%0A%20%20this%2Einit%28viewport%2C%20options%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Initialization%0A%20%2A%0A%20%2A%20%40param%20%20%7BSVGElement%7D%20viewport%0A%20%2A%20%40param%20%20%7BObject%7D%20options%0A%20%2A%2F%0AShadowViewport%2Eprototype%2Einit%20%3D%20function%28viewport%2C%20options%29%20%7B%0A%20%20%2F%2F%20DOM%20Elements%0A%20%20this%2Eviewport%20%3D%20viewport%0A%20%20this%2Eoptions%20%3D%20options%0A%0A%20%20%2F%2F%20State%20cache%0A%20%20this%2EoriginalState%20%3D%20%7Bzoom%3A%201%2C%20x%3A%200%2C%20y%3A%200%7D%0A%20%20this%2EactiveState%20%3D%20%7Bzoom%3A%201%2C%20x%3A%200%2C%20y%3A%200%7D%0A%0A%20%20this%2EupdateCTMCached%20%3D%20Utils%2Eproxy%28this%2EupdateCTM%2C%20this%29%0A%0A%20%20%2F%2F%20Create%20a%20custom%20requestAnimationFrame%20taking%20in%20account%20refreshRate%0A%20%20this%2ErequestAnimationFrame%20%3D%20Utils%2EcreateRequestAnimationFrame%28this%2Eoptions%2ErefreshRate%29%0A%0A%20%20%2F%2F%20ViewBox%0A%20%20this%2EviewBox%20%3D%20%7Bx%3A%200%2C%20y%3A%200%2C%20width%3A%200%2C%20height%3A%200%7D%0A%20%20this%2EcacheViewBox%28%29%0A%0A%20%20%2F%2F%20Process%20CTM%0A%20%20this%2EprocessCTM%28%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Cache%20initial%20viewBox%20value%0A%20%2A%20If%20no%20viewBox%20is%20defined%2C%20then%20use%20viewport%20size%2Fposition%20instead%20for%20viewBox%20values%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EcacheViewBox%20%3D%20function%28%29%20%7B%0A%20%20var%20svgViewBox%20%3D%20this%2Eoptions%2Esvg%2EgetAttribute%28%27viewBox%27%29%0A%0A%20%20if%20%28svgViewBox%29%20%7B%0A%20%20%20%20var%20viewBoxValues%20%3D%20svgViewBox%2Esplit%28%27%20%27%29%2Emap%28parseFloat%29%0A%0A%20%20%20%20%2F%2F%20Cache%20viewbox%20x%20and%20y%20offset%0A%20%20%20%20this%2EviewBox%2Ex%20%3D%20viewBoxValues%5B0%5D%0A%20%20%20%20this%2EviewBox%2Ey%20%3D%20viewBoxValues%5B1%5D%0A%20%20%20%20this%2EviewBox%2Ewidth%20%3D%20viewBoxValues%5B2%5D%0A%20%20%20%20this%2EviewBox%2Eheight%20%3D%20viewBoxValues%5B3%5D%0A%0A%20%20%20%20var%20zoom%20%3D%20Math%2Emin%28this%2Eoptions%2Ewidth%20%2F%20this%2EviewBox%2Ewidth%2C%20this%2Eoptions%2Eheight%20%2F%20this%2EviewBox%2Eheight%29%0A%0A%20%20%20%20%2F%2F%20Update%20active%20state%0A%20%20%20%20this%2EactiveState%2Ezoom%20%3D%20zoom%0A%20%20%20%20this%2EactiveState%2Ex%20%3D%20%28this%2Eoptions%2Ewidth%20%2D%20this%2EviewBox%2Ewidth%20%2A%20zoom%29%20%2F%202%0A%20%20%20%20this%2EactiveState%2Ey%20%3D%20%28this%2Eoptions%2Eheight%20%2D%20this%2EviewBox%2Eheight%20%2A%20zoom%29%20%2F%202%0A%0A%20%20%20%20%2F%2F%20Force%20updating%20CTM%0A%20%20%20%20this%2EupdateCTMOnNextFrame%28%29%0A%0A%20%20%20%20this%2Eoptions%2Esvg%2EremoveAttribute%28%27viewBox%27%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20var%20bBox%20%3D%20this%2Eviewport%2EgetBBox%28%29%3B%0A%0A%20%20%20%20%2F%2F%20Cache%20viewbox%20sizes%0A%20%20%20%20this%2EviewBox%2Ex%20%3D%20bBox%2Ex%3B%0A%20%20%20%20this%2EviewBox%2Ey%20%3D%20bBox%2Ey%3B%0A%20%20%20%20this%2EviewBox%2Ewidth%20%3D%20bBox%2Ewidth%0A%20%20%20%20this%2EviewBox%2Eheight%20%3D%20bBox%2Eheight%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Recalculate%20viewport%20sizes%20and%20update%20viewBox%20cache%0A%20%2A%2F%0AShadowViewport%2Eprototype%2ErecacheViewBox%20%3D%20function%28%29%20%7B%0A%20%20var%20boundingClientRect%20%3D%20this%2Eviewport%2EgetBoundingClientRect%28%29%0A%20%20%20%20%2C%20viewBoxWidth%20%3D%20boundingClientRect%2Ewidth%20%2F%20this%2EgetZoom%28%29%0A%20%20%20%20%2C%20viewBoxHeight%20%3D%20boundingClientRect%2Eheight%20%2F%20this%2EgetZoom%28%29%0A%0A%20%20%2F%2F%20Cache%20viewbox%0A%20%20this%2EviewBox%2Ex%20%3D%200%0A%20%20this%2EviewBox%2Ey%20%3D%200%0A%20%20this%2EviewBox%2Ewidth%20%3D%20viewBoxWidth%0A%20%20this%2EviewBox%2Eheight%20%3D%20viewBoxHeight%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Returns%20a%20viewbox%20object%2E%20Safe%20to%20alter%0A%20%2A%0A%20%2A%20%40return%20%7BObject%7D%20viewbox%20object%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetViewBox%20%3D%20function%28%29%20%7B%0A%20%20return%20Utils%2Eextend%28%7B%7D%2C%20this%2EviewBox%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20initial%20zoom%20and%20pan%20values%2E%20Save%20them%20into%20originalState%0A%20%2A%20Parses%20viewBox%20attribute%20to%20alter%20initial%20sizes%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EprocessCTM%20%3D%20function%28%29%20%7B%0A%20%20var%20newCTM%20%3D%20this%2EgetCTM%28%29%0A%0A%20%20if%20%28this%2Eoptions%2Efit%29%20%7B%0A%20%20%20%20var%20newScale%20%3D%20Math%2Emin%28this%2Eoptions%2Ewidth%2F%28this%2EviewBox%2Ewidth%20%2D%20this%2EviewBox%2Ex%29%2C%20this%2Eoptions%2Eheight%2F%28this%2EviewBox%2Eheight%20%2D%20this%2EviewBox%2Ey%29%29%3B%0A%0A%20%20%20%20newCTM%2Ea%20%3D%20newScale%3B%20%2F%2Fx%2Dscale%0A%20%20%20%20newCTM%2Ed%20%3D%20newScale%3B%20%2F%2Fy%2Dscale%0A%20%20%20%20newCTM%2Ee%20%3D%20%2Dthis%2EviewBox%2Ex%20%2A%20newScale%3B%20%2F%2Fx%2Dtransform%0A%20%20%20%20newCTM%2Ef%20%3D%20%2Dthis%2EviewBox%2Ey%20%2A%20newScale%3B%20%2F%2Fy%2Dtransform%0A%20%20%7D%0A%0A%20%20if%20%28this%2Eoptions%2Ecenter%29%20%7B%0A%20%20%20%20var%20offsetX%20%3D%20%28this%2Eoptions%2Ewidth%20%2D%20%28this%2EviewBox%2Ewidth%20%2B%20this%2EviewBox%2Ex%29%20%2A%20newCTM%2Ea%29%20%2A%200%2E5%0A%20%20%20%20%20%20%2C%20offsetY%20%3D%20%28this%2Eoptions%2Eheight%20%2D%20%28this%2EviewBox%2Eheight%20%2B%20this%2EviewBox%2Ey%29%20%2A%20newCTM%2Ea%29%20%2A%200%2E5%0A%0A%20%20%20%20newCTM%2Ee%20%3D%20offsetX%0A%20%20%20%20newCTM%2Ef%20%3D%20offsetY%0A%20%20%7D%0A%0A%20%20%2F%2F%20Cache%20initial%20values%2E%20Based%20on%20activeState%20and%20fix%2Bcenter%20opitons%0A%20%20this%2EoriginalState%2Ezoom%20%3D%20newCTM%2Ea%0A%20%20this%2EoriginalState%2Ex%20%3D%20newCTM%2Ee%0A%20%20this%2EoriginalState%2Ey%20%3D%20newCTM%2Ef%0A%0A%20%20%2F%2F%20Update%20viewport%20CTM%20and%20cache%20zoom%20and%20pan%0A%20%20this%2EsetCTM%28newCTM%29%3B%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Return%20originalState%20object%2E%20Safe%20to%20alter%0A%20%2A%0A%20%2A%20%40return%20%7BObject%7D%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetOriginalState%20%3D%20function%28%29%20%7B%0A%20%20return%20Utils%2Eextend%28%7B%7D%2C%20this%2EoriginalState%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Return%20actualState%20object%2E%20Safe%20to%20alter%0A%20%2A%0A%20%2A%20%40return%20%7BObject%7D%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetState%20%3D%20function%28%29%20%7B%0A%20%20return%20Utils%2Eextend%28%7B%7D%2C%20this%2EactiveState%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20zoom%20scale%0A%20%2A%0A%20%2A%20%40return%20%7BFloat%7D%20zoom%20scale%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetZoom%20%3D%20function%28%29%20%7B%0A%20%20return%20this%2EactiveState%2Ezoom%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20zoom%20scale%20for%20pubilc%20usage%0A%20%2A%0A%20%2A%20%40return%20%7BFloat%7D%20zoom%20scale%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetRelativeZoom%20%3D%20function%28%29%20%7B%0A%20%20return%20this%2EactiveState%2Ezoom%20%2F%20this%2EoriginalState%2Ezoom%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Compute%20zoom%20scale%20for%20pubilc%20usage%0A%20%2A%0A%20%2A%20%40return%20%7BFloat%7D%20zoom%20scale%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EcomputeRelativeZoom%20%3D%20function%28scale%29%20%7B%0A%20%20return%20scale%20%2F%20this%2EoriginalState%2Ezoom%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20pan%0A%20%2A%0A%20%2A%20%40return%20%7BObject%7D%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetPan%20%3D%20function%28%29%20%7B%0A%20%20return%20%7Bx%3A%20this%2EactiveState%2Ex%2C%20y%3A%20this%2EactiveState%2Ey%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Return%20cached%20viewport%20CTM%20value%20that%20can%20be%20safely%20modified%0A%20%2A%0A%20%2A%20%40return%20%7BSVGMatrix%7D%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EgetCTM%20%3D%20function%28%29%20%7B%0A%20%20var%20safeCTM%20%3D%20this%2Eoptions%2Esvg%2EcreateSVGMatrix%28%29%0A%0A%20%20%2F%2F%20Copy%20values%20manually%20as%20in%20FF%20they%20are%20not%20itterable%0A%20%20safeCTM%2Ea%20%3D%20this%2EactiveState%2Ezoom%0A%20%20safeCTM%2Eb%20%3D%200%0A%20%20safeCTM%2Ec%20%3D%200%0A%20%20safeCTM%2Ed%20%3D%20this%2EactiveState%2Ezoom%0A%20%20safeCTM%2Ee%20%3D%20this%2EactiveState%2Ex%0A%20%20safeCTM%2Ef%20%3D%20this%2EactiveState%2Ey%0A%0A%20%20return%20safeCTM%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Set%20a%20new%20CTM%0A%20%2A%0A%20%2A%20%40param%20%7BSVGMatrix%7D%20newCTM%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EsetCTM%20%3D%20function%28newCTM%29%20%7B%0A%20%20var%20willZoom%20%3D%20this%2EisZoomDifferent%28newCTM%29%0A%20%20%20%20%2C%20willPan%20%3D%20this%2EisPanDifferent%28newCTM%29%0A%0A%20%20if%20%28willZoom%20%7C%7C%20willPan%29%20%7B%0A%20%20%20%20%2F%2F%20Before%20zoom%0A%20%20%20%20if%20%28willZoom%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20If%20returns%20false%20then%20cancel%20zooming%0A%20%20%20%20%20%20if%20%28this%2Eoptions%2EbeforeZoom%28this%2EgetRelativeZoom%28%29%2C%20this%2EcomputeRelativeZoom%28newCTM%2Ea%29%29%20%3D%3D%3D%20false%29%20%7B%0A%20%20%20%20%20%20%20%20newCTM%2Ea%20%3D%20newCTM%2Ed%20%3D%20this%2EactiveState%2Ezoom%0A%20%20%20%20%20%20%20%20willZoom%20%3D%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Before%20pan%0A%20%20%20%20if%20%28willPan%29%20%7B%0A%20%20%20%20%20%20var%20preventPan%20%3D%20this%2Eoptions%2EbeforePan%28this%2EgetPan%28%29%2C%20%7Bx%3A%20newCTM%2Ee%2C%20y%3A%20newCTM%2Ef%7D%29%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20If%20prevent%20pan%20is%20an%20object%0A%20%20%20%20%20%20%20%20%2C%20preventPanX%20%3D%20false%0A%20%20%20%20%20%20%20%20%2C%20preventPanY%20%3D%20false%0A%0A%20%20%20%20%20%20%2F%2F%20If%20prevent%20pan%20is%20Boolean%20false%0A%20%20%20%20%20%20if%20%28preventPan%20%3D%3D%3D%20false%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Set%20x%20and%20y%20same%20as%20before%0A%20%20%20%20%20%20%20%20newCTM%2Ee%20%3D%20this%2EgetPan%28%29%2Ex%0A%20%20%20%20%20%20%20%20newCTM%2Ef%20%3D%20this%2EgetPan%28%29%2Ey%0A%0A%20%20%20%20%20%20%20%20preventPanX%20%3D%20preventPanY%20%3D%20true%0A%20%20%20%20%20%20%7D%20else%20if%20%28Utils%2EisObject%28preventPan%29%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Check%20for%20X%20axes%20attribute%0A%20%20%20%20%20%20%20%20if%20%28preventPan%2Ex%20%3D%3D%3D%20false%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Prevent%20panning%20on%20x%20axes%0A%20%20%20%20%20%20%20%20%20%20newCTM%2Ee%20%3D%20this%2EgetPan%28%29%2Ex%0A%20%20%20%20%20%20%20%20%20%20preventPanX%20%3D%20true%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28Utils%2EisNumber%28preventPan%2Ex%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Set%20a%20custom%20pan%20value%0A%20%20%20%20%20%20%20%20%20%20newCTM%2Ee%20%3D%20preventPan%2Ex%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Check%20for%20Y%20axes%20attribute%0A%20%20%20%20%20%20%20%20if%20%28preventPan%2Ey%20%3D%3D%3D%20false%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Prevent%20panning%20on%20x%20axes%0A%20%20%20%20%20%20%20%20%20%20newCTM%2Ef%20%3D%20this%2EgetPan%28%29%2Ey%0A%20%20%20%20%20%20%20%20%20%20preventPanY%20%3D%20true%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20%28Utils%2EisNumber%28preventPan%2Ey%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Set%20a%20custom%20pan%20value%0A%20%20%20%20%20%20%20%20%20%20newCTM%2Ef%20%3D%20preventPan%2Ey%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Update%20willPan%20flag%0A%20%20%20%20%20%20if%20%28preventPanX%20%26%26%20preventPanY%29%20%7B%0A%20%20%20%20%20%20%20%20willPan%20%3D%20false%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Check%20again%20if%20should%20zoom%20or%20pan%0A%20%20%20%20if%20%28willZoom%20%7C%7C%20willPan%29%20%7B%0A%20%20%20%20%20%20this%2EupdateCache%28newCTM%29%0A%0A%20%20%20%20%20%20this%2EupdateCTMOnNextFrame%28%29%0A%0A%20%20%20%20%20%20%2F%2F%20After%20callbacks%0A%20%20%20%20%20%20if%20%28willZoom%29%20%7Bthis%2Eoptions%2EonZoom%28this%2EgetRelativeZoom%28%29%29%7D%0A%20%20%20%20%20%20if%20%28willPan%29%20%7Bthis%2Eoptions%2EonPan%28this%2EgetPan%28%29%29%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0AShadowViewport%2Eprototype%2EisZoomDifferent%20%3D%20function%28newCTM%29%20%7B%0A%20%20return%20this%2EactiveState%2Ezoom%20%21%3D%3D%20newCTM%2Ea%0A%7D%0A%0AShadowViewport%2Eprototype%2EisPanDifferent%20%3D%20function%28newCTM%29%20%7B%0A%20%20return%20this%2EactiveState%2Ex%20%21%3D%3D%20newCTM%2Ee%20%7C%7C%20this%2EactiveState%2Ey%20%21%3D%3D%20newCTM%2Ef%0A%7D%0A%0A%0A%2F%2A%2A%0A%20%2A%20Update%20cached%20CTM%20and%20active%20state%0A%20%2A%0A%20%2A%20%40param%20%7BSVGMatrix%7D%20newCTM%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EupdateCache%20%3D%20function%28newCTM%29%20%7B%0A%20%20this%2EactiveState%2Ezoom%20%3D%20newCTM%2Ea%0A%20%20this%2EactiveState%2Ex%20%3D%20newCTM%2Ee%0A%20%20this%2EactiveState%2Ey%20%3D%20newCTM%2Ef%0A%7D%0A%0AShadowViewport%2Eprototype%2EpendingUpdate%20%3D%20false%0A%0A%2F%2A%2A%0A%20%2A%20Place%20a%20request%20to%20update%20CTM%20on%20next%20Frame%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EupdateCTMOnNextFrame%20%3D%20function%28%29%20%7B%0A%20%20if%20%28%21this%2EpendingUpdate%29%20%7B%0A%20%20%20%20%2F%2F%20Lock%0A%20%20%20%20this%2EpendingUpdate%20%3D%20true%0A%0A%20%20%20%20%2F%2F%20Throttle%20next%20update%0A%20%20%20%20this%2ErequestAnimationFrame%2Ecall%28window%2C%20this%2EupdateCTMCached%29%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Update%20viewport%20CTM%20with%20cached%20CTM%0A%20%2A%2F%0AShadowViewport%2Eprototype%2EupdateCTM%20%3D%20function%28%29%20%7B%0A%20%20%2F%2F%20Updates%20SVG%20element%0A%20%20SvgUtils%2EsetCTM%28this%2Eviewport%2C%20this%2EgetCTM%28%29%2C%20this%2Edefs%29%0A%0A%20%20%2F%2F%20Free%20the%20lock%0A%20%20this%2EpendingUpdate%20%3D%20false%0A%7D%0A%0Amodule%2Eexports%20%3D%20function%28viewport%2C%20options%29%7B%0A%20%20return%20new%20ShadowViewport%28viewport%2C%20options%29%0A%7D%0A%0A%7D%2C%7B%22%2E%2Fsvg%2Dutilities%22%3A6%2C%22%2E%2Futilities%22%3A7%7D%5D%2C5%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0Avar%20Wheel%20%3D%20require%28%27uniwheel%27%29%0A%2C%20ControlIcons%20%3D%20require%28%27%2E%2Fcontrol%2Dicons%27%29%0A%2C%20Utils%20%3D%20require%28%27%2E%2Futilities%27%29%0A%2C%20SvgUtils%20%3D%20require%28%27%2E%2Fsvg%2Dutilities%27%29%0A%2C%20ShadowViewport%20%3D%20require%28%27%2E%2Fshadow%2Dviewport%27%29%0A%0Avar%20SvgPanZoom%20%3D%20function%28svg%2C%20options%29%20%7B%0A%20%20this%2Einit%28svg%2C%20options%29%0A%7D%0A%0Avar%20optionsDefaults%20%3D%20%7B%0A%20%20viewportSelector%3A%20%27%2Esvg%2Dpan%2Dzoom%5Fviewport%27%20%2F%2F%20Viewport%20selector%2E%20Can%20be%20querySelector%20string%20or%20SVGElement%0A%2C%20panEnabled%3A%20true%20%2F%2F%20enable%20or%20disable%20panning%20%28default%20enabled%29%0A%2C%20controlIconsEnabled%3A%20false%20%2F%2F%20insert%20icons%20to%20give%20user%20an%20option%20in%20addition%20to%20mouse%20events%20to%20control%20pan%2Fzoom%20%28default%20disabled%29%0A%2C%20zoomEnabled%3A%20true%20%2F%2F%20enable%20or%20disable%20zooming%20%28default%20enabled%29%0A%2C%20dblClickZoomEnabled%3A%20true%20%2F%2F%20enable%20or%20disable%20zooming%20by%20double%20clicking%20%28default%20enabled%29%0A%2C%20mouseWheelZoomEnabled%3A%20true%20%2F%2F%20enable%20or%20disable%20zooming%20by%20mouse%20wheel%20%28default%20enabled%29%0A%2C%20zoomScaleSensitivity%3A%200%2E2%20%2F%2F%20Zoom%20sensitivity%0A%2C%20minZoom%3A%200%2E5%20%2F%2F%20Minimum%20Zoom%20level%0A%2C%20maxZoom%3A%2010%20%2F%2F%20Maximum%20Zoom%20level%0A%2C%20fit%3A%20true%20%2F%2F%20enable%20or%20disable%20viewport%20fit%20in%20SVG%20%28default%20true%29%0A%2C%20center%3A%20true%20%2F%2F%20enable%20or%20disable%20viewport%20centering%20in%20SVG%20%28default%20true%29%0A%2C%20refreshRate%3A%20%27auto%27%20%2F%2F%20Maximum%20number%20of%20frames%20per%20second%20%28altering%20SVG%27s%20viewport%29%0A%2C%20beforeZoom%3A%20null%0A%2C%20onZoom%3A%20null%0A%2C%20beforePan%3A%20null%0A%2C%20onPan%3A%20null%0A%2C%20customEventsHandler%3A%20null%0A%7D%0A%0ASvgPanZoom%2Eprototype%2Einit%20%3D%20function%28svg%2C%20options%29%20%7B%0A%20%20var%20that%20%3D%20this%0A%0A%20%20this%2Esvg%20%3D%20svg%0A%20%20this%2Edefs%20%3D%20svg%2EquerySelector%28%27defs%27%29%0A%0A%20%20%2F%2F%20Add%20default%20attributes%20to%20SVG%0A%20%20SvgUtils%2EsetupSvgAttributes%28this%2Esvg%29%0A%0A%20%20%2F%2F%20Set%20options%0A%20%20this%2Eoptions%20%3D%20Utils%2Eextend%28Utils%2Eextend%28%7B%7D%2C%20optionsDefaults%29%2C%20options%29%0A%0A%20%20%2F%2F%20Set%20default%20state%0A%20%20this%2Estate%20%3D%20%27none%27%0A%0A%20%20%2F%2F%20Get%20dimensions%0A%20%20var%20boundingClientRectNormalized%20%3D%20SvgUtils%2EgetBoundingClientRectNormalized%28svg%29%0A%20%20this%2Ewidth%20%3D%20boundingClientRectNormalized%2Ewidth%0A%20%20this%2Eheight%20%3D%20boundingClientRectNormalized%2Eheight%0A%0A%20%20%2F%2F%20Init%20shadow%20viewport%0A%20%20this%2Eviewport%20%3D%20ShadowViewport%28SvgUtils%2EgetOrCreateViewport%28this%2Esvg%2C%20this%2Eoptions%2EviewportSelector%29%2C%20%7B%0A%20%20%20%20svg%3A%20this%2Esvg%0A%20%20%2C%20width%3A%20this%2Ewidth%0A%20%20%2C%20height%3A%20this%2Eheight%0A%20%20%2C%20fit%3A%20this%2Eoptions%2Efit%0A%20%20%2C%20center%3A%20this%2Eoptions%2Ecenter%0A%20%20%2C%20refreshRate%3A%20this%2Eoptions%2ErefreshRate%0A%20%20%2F%2F%20Put%20callbacks%20into%20functions%20as%20they%20can%20change%20through%20time%0A%20%20%2C%20beforeZoom%3A%20function%28oldScale%2C%20newScale%29%20%7B%0A%20%20%20%20%20%20if%20%28that%2Eviewport%20%26%26%20that%2Eoptions%2EbeforeZoom%29%20%7Breturn%20that%2Eoptions%2EbeforeZoom%28oldScale%2C%20newScale%29%7D%0A%20%20%20%20%7D%0A%20%20%2C%20onZoom%3A%20function%28scale%29%20%7B%0A%20%20%20%20%20%20if%20%28that%2Eviewport%20%26%26%20that%2Eoptions%2EonZoom%29%20%7Breturn%20that%2Eoptions%2EonZoom%28scale%29%7D%0A%20%20%20%20%7D%0A%20%20%2C%20beforePan%3A%20function%28oldPoint%2C%20newPoint%29%20%7B%0A%20%20%20%20%20%20if%20%28that%2Eviewport%20%26%26%20that%2Eoptions%2EbeforePan%29%20%7Breturn%20that%2Eoptions%2EbeforePan%28oldPoint%2C%20newPoint%29%7D%0A%20%20%20%20%7D%0A%20%20%2C%20onPan%3A%20function%28point%29%20%7B%0A%20%20%20%20%20%20if%20%28that%2Eviewport%20%26%26%20that%2Eoptions%2EonPan%29%20%7Breturn%20that%2Eoptions%2EonPan%28point%29%7D%0A%20%20%20%20%7D%0A%20%20%7D%29%0A%0A%20%20%2F%2F%20Wrap%20callbacks%20into%20public%20API%20context%0A%20%20var%20publicInstance%20%3D%20this%2EgetPublicInstance%28%29%0A%20%20publicInstance%2EsetBeforeZoom%28this%2Eoptions%2EbeforeZoom%29%0A%20%20publicInstance%2EsetOnZoom%28this%2Eoptions%2EonZoom%29%0A%20%20publicInstance%2EsetBeforePan%28this%2Eoptions%2EbeforePan%29%0A%20%20publicInstance%2EsetOnPan%28this%2Eoptions%2EonPan%29%0A%0A%20%20if%20%28this%2Eoptions%2EcontrolIconsEnabled%29%20%7B%0A%20%20%20%20ControlIcons%2Eenable%28this%29%0A%20%20%7D%0A%0A%20%20%2F%2F%20Init%20events%20handlers%0A%20%20this%2EsetupHandlers%28%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Register%20event%20handlers%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EsetupHandlers%20%3D%20function%28%29%20%7B%0A%20%20var%20that%20%3D%20this%0A%20%20%20%20%2C%20prevEvt%20%3D%20null%20%2F%2F%20use%20for%20touchstart%20event%20to%20detect%20double%20tap%0A%20%20%20%20%3B%0A%0A%20%20this%2EeventListeners%20%3D%20%7B%0A%20%20%20%20%2F%2F%20Mouse%20down%20group%0A%20%20%20%20mousedown%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseDown%28evt%2C%20null%29%3B%0A%20%20%20%20%7D%0A%20%20%2C%20touchstart%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20var%20result%20%3D%20that%2EhandleMouseDown%28evt%2C%20prevEvt%29%3B%0A%20%20%20%20%20%20prevEvt%20%3D%20evt%0A%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Mouse%20up%20group%0A%20%20%2C%20mouseup%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseUp%28evt%29%3B%0A%20%20%20%20%7D%0A%20%20%2C%20touchend%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseUp%28evt%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Mouse%20move%20group%0A%20%20%2C%20mousemove%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseMove%28evt%29%3B%0A%20%20%20%20%7D%0A%20%20%2C%20touchmove%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseMove%28evt%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Mouse%20leave%20group%0A%20%20%2C%20mouseleave%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseUp%28evt%29%3B%0A%20%20%20%20%7D%0A%20%20%2C%20touchleave%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseUp%28evt%29%3B%0A%20%20%20%20%7D%0A%20%20%2C%20touchcancel%3A%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseUp%28evt%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Init%20custom%20events%20handler%20if%20available%0A%20%20if%20%28this%2Eoptions%2EcustomEventsHandler%20%21%3D%20null%29%20%7B%20%2F%2F%20jshint%20ignore%3Aline%0A%20%20%20%20this%2Eoptions%2EcustomEventsHandler%2Einit%28%7B%0A%20%20%20%20%20%20svgElement%3A%20this%2Esvg%0A%20%20%20%20%2C%20instance%3A%20this%2EgetPublicInstance%28%29%0A%20%20%20%20%7D%29%0A%0A%20%20%20%20%2F%2F%20Custom%20event%20handler%20may%20halt%20builtin%20listeners%0A%20%20%20%20var%20haltEventListeners%20%3D%20this%2Eoptions%2EcustomEventsHandler%2EhaltEventListeners%0A%20%20%20%20if%20%28haltEventListeners%20%26%26%20haltEventListeners%2Elength%29%20%7B%0A%20%20%20%20%20%20for%20%28var%20i%20%3D%20haltEventListeners%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28this%2EeventListeners%2EhasOwnProperty%28haltEventListeners%5Bi%5D%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20delete%20this%2EeventListeners%5BhaltEventListeners%5Bi%5D%5D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2F%20Bind%20eventListeners%0A%20%20for%20%28var%20event%20in%20this%2EeventListeners%29%20%7B%0A%20%20%20%20this%2Esvg%2EaddEventListener%28event%2C%20this%2EeventListeners%5Bevent%5D%2C%20false%29%0A%20%20%7D%0A%0A%20%20%2F%2F%20Zoom%20using%20mouse%20wheel%0A%20%20if%20%28this%2Eoptions%2EmouseWheelZoomEnabled%29%20%7B%0A%20%20%20%20this%2Eoptions%2EmouseWheelZoomEnabled%20%3D%20false%20%2F%2F%20set%20to%20false%20as%20enable%20will%20set%20it%20back%20to%20true%0A%20%20%20%20this%2EenableMouseWheelZoom%28%29%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Enable%20ability%20to%20zoom%20using%20mouse%20wheel%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EenableMouseWheelZoom%20%3D%20function%28%29%20%7B%0A%20%20if%20%28%21this%2Eoptions%2EmouseWheelZoomEnabled%29%20%7B%0A%20%20%20%20var%20that%20%3D%20this%0A%0A%20%20%20%20%2F%2F%20Mouse%20wheel%20listener%0A%20%20%20%20this%2EwheelListener%20%3D%20function%28evt%29%20%7B%0A%20%20%20%20%20%20return%20that%2EhandleMouseWheel%28evt%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Bind%20wheelListener%0A%20%20%20%20Wheel%2Eon%28this%2Esvg%2C%20this%2EwheelListener%2C%20false%29%0A%0A%20%20%20%20this%2Eoptions%2EmouseWheelZoomEnabled%20%3D%20true%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Disable%20ability%20to%20zoom%20using%20mouse%20wheel%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EdisableMouseWheelZoom%20%3D%20function%28%29%20%7B%0A%20%20if%20%28this%2Eoptions%2EmouseWheelZoomEnabled%29%20%7B%0A%20%20%20%20Wheel%2Eoff%28this%2Esvg%2C%20this%2EwheelListener%2C%20false%29%0A%20%20%20%20this%2Eoptions%2EmouseWheelZoomEnabled%20%3D%20false%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Handle%20mouse%20wheel%20event%0A%20%2A%0A%20%2A%20%40param%20%20%7BEvent%7D%20evt%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EhandleMouseWheel%20%3D%20function%28evt%29%20%7B%0A%20%20if%20%28%21this%2Eoptions%2EzoomEnabled%20%7C%7C%20this%2Estate%20%21%3D%3D%20%27none%27%29%20%7B%0A%20%20%20%20return%3B%0A%20%20%7D%0A%0A%20%20if%20%28evt%2EpreventDefault%29%20%7B%0A%20%20%20%20evt%2EpreventDefault%28%29%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20evt%2EreturnValue%20%3D%20false%3B%0A%20%20%7D%0A%0A%20%20var%20delta%20%3D%200%0A%0A%20%20if%20%28%27deltaMode%27%20in%20evt%20%26%26%20evt%2EdeltaMode%20%3D%3D%3D%200%29%20%7B%0A%20%20%20%20%2F%2F%20Make%20empirical%20adjustments%20for%20browsers%20that%20give%20deltaY%20in%20pixels%20%28deltaMode%3D0%29%0A%0A%20%20%20%20if%20%28evt%2EwheelDelta%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Normalizer%20for%20Chrome%0A%20%20%20%20%20%20delta%20%3D%20evt%2EdeltaY%20%2F%20Math%2Eabs%28evt%2EwheelDelta%2F3%29%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%2F%2F%20Others%2E%20Possibly%20tablets%3F%20Use%20a%20value%20just%20in%20case%0A%20%20%20%20%20%20delta%20%3D%20evt%2EdeltaY%20%2F%20120%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20%28%27mozPressure%27%20in%20evt%29%20%7B%0A%20%20%20%20%2F%2F%20Normalizer%20for%20newer%20Firefox%0A%20%20%20%20%2F%2F%20NOTE%3A%20May%20need%20to%20change%20detection%20at%20some%20point%20if%20mozPressure%20disappears%2E%0A%20%20%20%20delta%20%3D%20evt%2EdeltaY%20%2F%203%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20%2F%2F%20Others%20should%20be%20reasonably%20normalized%20by%20the%20mousewheel%20code%20at%20the%20end%20of%20the%20file%2E%0A%20%20%20%20delta%20%3D%20evt%2EdeltaY%3B%0A%20%20%7D%0A%0A%20%20var%20inversedScreenCTM%20%3D%20this%2Esvg%2EgetScreenCTM%28%29%2Einverse%28%29%0A%20%20%20%20%2C%20relativeMousePoint%20%3D%20SvgUtils%2EgetEventPoint%28evt%2C%20this%2Esvg%29%2EmatrixTransform%28inversedScreenCTM%29%0A%20%20%20%20%2C%20zoom%20%3D%20Math%2Epow%281%20%2B%20this%2Eoptions%2EzoomScaleSensitivity%2C%20%28%2D1%29%20%2A%20delta%29%3B%20%2F%2F%20multiplying%20by%20neg%2E%201%20so%20as%20to%20make%20zoom%20in%2Fout%20behavior%20match%20Google%20maps%20behavior%0A%0A%20%20this%2EzoomAtPoint%28zoom%2C%20relativeMousePoint%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Zoom%20in%20at%20a%20SVG%20point%0A%20%2A%0A%20%2A%20%40param%20%20%7BSVGPoint%7D%20point%0A%20%2A%20%40param%20%20%7BFloat%7D%20zoomScale%20%20%20%20Number%20representing%20how%20much%20to%20zoom%0A%20%2A%20%40param%20%20%7BBoolean%7D%20zoomAbsolute%20Default%20false%2E%20If%20true%2C%20zoomScale%20is%20treated%20as%20an%20absolute%20value%2E%0A%20%2A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Otherwise%2C%20zoomScale%20is%20treated%20as%20a%20multiplied%20%28e%2Eg%2E%201%2E10%20would%20zoom%20in%2010%25%29%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EzoomAtPoint%20%3D%20function%28zoomScale%2C%20point%2C%20zoomAbsolute%29%20%7B%0A%20%20var%20originalState%20%3D%20this%2Eviewport%2EgetOriginalState%28%29%0A%0A%20%20if%20%28%21zoomAbsolute%29%20%7B%0A%20%20%20%20%2F%2F%20Fit%20zoomScale%20in%20set%20bounds%0A%20%20%20%20if%20%28this%2EgetZoom%28%29%20%2A%20zoomScale%20%3C%20this%2Eoptions%2EminZoom%20%2A%20originalState%2Ezoom%29%20%7B%0A%20%20%20%20%20%20zoomScale%20%3D%20%28this%2Eoptions%2EminZoom%20%2A%20originalState%2Ezoom%29%20%2F%20this%2EgetZoom%28%29%0A%20%20%20%20%7D%20else%20if%20%28this%2EgetZoom%28%29%20%2A%20zoomScale%20%3E%20this%2Eoptions%2EmaxZoom%20%2A%20originalState%2Ezoom%29%20%7B%0A%20%20%20%20%20%20zoomScale%20%3D%20%28this%2Eoptions%2EmaxZoom%20%2A%20originalState%2Ezoom%29%20%2F%20this%2EgetZoom%28%29%0A%20%20%20%20%7D%0A%20%20%7D%20else%20%7B%0A%20%20%20%20%2F%2F%20Fit%20zoomScale%20in%20set%20bounds%0A%20%20%20%20zoomScale%20%3D%20Math%2Emax%28this%2Eoptions%2EminZoom%20%2A%20originalState%2Ezoom%2C%20Math%2Emin%28this%2Eoptions%2EmaxZoom%20%2A%20originalState%2Ezoom%2C%20zoomScale%29%29%0A%20%20%20%20%2F%2F%20Find%20relative%20scale%20to%20achieve%20desired%20scale%0A%20%20%20%20zoomScale%20%3D%20zoomScale%2Fthis%2EgetZoom%28%29%0A%20%20%7D%0A%0A%20%20var%20oldCTM%20%3D%20this%2Eviewport%2EgetCTM%28%29%0A%20%20%20%20%2C%20relativePoint%20%3D%20point%2EmatrixTransform%28oldCTM%2Einverse%28%29%29%0A%20%20%20%20%2C%20modifier%20%3D%20this%2Esvg%2EcreateSVGMatrix%28%29%2Etranslate%28relativePoint%2Ex%2C%20relativePoint%2Ey%29%2Escale%28zoomScale%29%2Etranslate%28%2DrelativePoint%2Ex%2C%20%2DrelativePoint%2Ey%29%0A%20%20%20%20%2C%20newCTM%20%3D%20oldCTM%2Emultiply%28modifier%29%0A%0A%20%20if%20%28newCTM%2Ea%20%21%3D%3D%20oldCTM%2Ea%29%20%7B%0A%20%20%20%20this%2Eviewport%2EsetCTM%28newCTM%29%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Zoom%20at%20center%20point%0A%20%2A%0A%20%2A%20%40param%20%20%7BFloat%7D%20scale%0A%20%2A%20%40param%20%20%7BBoolean%7D%20absolute%20Marks%20zoom%20scale%20as%20relative%20or%20absolute%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Ezoom%20%3D%20function%28scale%2C%20absolute%29%20%7B%0A%20%20this%2EzoomAtPoint%28scale%2C%20SvgUtils%2EgetSvgCenterPoint%28this%2Esvg%2C%20this%2Ewidth%2C%20this%2Eheight%29%2C%20absolute%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Zoom%20used%20by%20public%20instance%0A%20%2A%0A%20%2A%20%40param%20%20%7BFloat%7D%20scale%0A%20%2A%20%40param%20%20%7BBoolean%7D%20absolute%20Marks%20zoom%20scale%20as%20relative%20or%20absolute%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EpublicZoom%20%3D%20function%28scale%2C%20absolute%29%20%7B%0A%20%20if%20%28absolute%29%20%7B%0A%20%20%20%20scale%20%3D%20this%2EcomputeFromRelativeZoom%28scale%29%0A%20%20%7D%0A%0A%20%20this%2Ezoom%28scale%2C%20absolute%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Zoom%20at%20point%20used%20by%20public%20instance%0A%20%2A%0A%20%2A%20%40param%20%20%7BFloat%7D%20scale%0A%20%2A%20%40param%20%20%7BSVGPoint%7CObject%7D%20point%20%20%20%20An%20object%20that%20has%20x%20and%20y%20attributes%0A%20%2A%20%40param%20%20%7BBoolean%7D%20absolute%20Marks%20zoom%20scale%20as%20relative%20or%20absolute%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EpublicZoomAtPoint%20%3D%20function%28scale%2C%20point%2C%20absolute%29%20%7B%0A%20%20if%20%28absolute%29%20%7B%0A%20%20%20%20%2F%2F%20Transform%20zoom%20into%20a%20relative%20value%0A%20%20%20%20scale%20%3D%20this%2EcomputeFromRelativeZoom%28scale%29%0A%20%20%7D%0A%0A%20%20%2F%2F%20If%20not%20a%20SVGPoint%20but%20has%20x%20and%20y%20than%20create%20a%20SVGPoint%0A%20%20if%20%28Utils%2EgetType%28point%29%20%21%3D%3D%20%27SVGPoint%27%20%26%26%20%27x%27%20in%20point%20%26%26%20%27y%27%20in%20point%29%20%7B%0A%20%20%20%20point%20%3D%20SvgUtils%2EcreateSVGPoint%28this%2Esvg%2C%20point%2Ex%2C%20point%2Ey%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20throw%20new%20Error%28%27Given%20point%20is%20invalid%27%29%0A%20%20%20%20return%0A%20%20%7D%0A%0A%20%20this%2EzoomAtPoint%28scale%2C%20point%2C%20absolute%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20zoom%20scale%0A%20%2A%0A%20%2A%20%40return%20%7BFloat%7D%20zoom%20scale%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EgetZoom%20%3D%20function%28%29%20%7B%0A%20%20return%20this%2Eviewport%2EgetZoom%28%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20zoom%20scale%20for%20public%20usage%0A%20%2A%0A%20%2A%20%40return%20%7BFloat%7D%20zoom%20scale%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EgetRelativeZoom%20%3D%20function%28%29%20%7B%0A%20%20return%20this%2Eviewport%2EgetRelativeZoom%28%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Compute%20actual%20zoom%20from%20public%20zoom%0A%20%2A%0A%20%2A%20%40param%20%20%7BFloat%7D%20zoom%0A%20%2A%20%40return%20%7BFloat%7D%20zoom%20scale%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EcomputeFromRelativeZoom%20%3D%20function%28zoom%29%20%7B%0A%20%20return%20zoom%20%2A%20this%2Eviewport%2EgetOriginalState%28%29%2Ezoom%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Set%20zoom%20to%20initial%20state%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EresetZoom%20%3D%20function%28%29%20%7B%0A%20%20var%20originalState%20%3D%20this%2Eviewport%2EgetOriginalState%28%29%0A%0A%20%20this%2Ezoom%28originalState%2Ezoom%2C%20true%29%3B%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Set%20pan%20to%20initial%20state%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EresetPan%20%3D%20function%28%29%20%7B%0A%20%20this%2Epan%28this%2Eviewport%2EgetOriginalState%28%29%29%3B%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Set%20pan%20and%20zoom%20to%20initial%20state%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Ereset%20%3D%20function%28%29%20%7B%0A%20%20this%2EresetZoom%28%29%0A%20%20this%2EresetPan%28%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Handle%20double%20click%20event%0A%20%2A%20See%20handleMouseDown%28%29%20for%20alternate%20detection%20method%0A%20%2A%0A%20%2A%20%40param%20%7BEvent%7D%20evt%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EhandleDblClick%20%3D%20function%28evt%29%20%7B%0A%20%20if%20%28evt%2EpreventDefault%29%20%7B%0A%20%20%20%20evt%2EpreventDefault%28%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20evt%2EreturnValue%20%3D%20false%0A%20%20%7D%0A%0A%20%20%2F%2F%20Check%20if%20target%20was%20a%20control%20button%0A%20%20if%20%28this%2Eoptions%2EcontrolIconsEnabled%29%20%7B%0A%20%20%20%20var%20targetClass%20%3D%20evt%2Etarget%2EgetAttribute%28%27class%27%29%20%7C%7C%20%27%27%0A%20%20%20%20if%20%28targetClass%2EindexOf%28%27svg%2Dpan%2Dzoom%2Dcontrol%27%29%20%3E%20%2D1%29%20%7B%0A%20%20%20%20%20%20return%20false%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20var%20zoomFactor%0A%0A%20%20if%20%28evt%2EshiftKey%29%20%7B%0A%20%20%20%20zoomFactor%20%3D%201%2F%28%281%20%2B%20this%2Eoptions%2EzoomScaleSensitivity%29%20%2A%202%29%20%2F%2F%20zoom%20out%20when%20shift%20key%20pressed%0A%20%20%7D%20else%20%7B%0A%20%20%20%20zoomFactor%20%3D%20%281%20%2B%20this%2Eoptions%2EzoomScaleSensitivity%29%20%2A%202%0A%20%20%7D%0A%0A%20%20var%20point%20%3D%20SvgUtils%2EgetEventPoint%28evt%2C%20this%2Esvg%29%2EmatrixTransform%28this%2Esvg%2EgetScreenCTM%28%29%2Einverse%28%29%29%0A%20%20this%2EzoomAtPoint%28zoomFactor%2C%20point%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Handle%20click%20event%0A%20%2A%0A%20%2A%20%40param%20%7BEvent%7D%20evt%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EhandleMouseDown%20%3D%20function%28evt%2C%20prevEvt%29%20%7B%0A%20%20if%20%28evt%2EpreventDefault%29%20%7B%0A%20%20%20%20evt%2EpreventDefault%28%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20evt%2EreturnValue%20%3D%20false%0A%20%20%7D%0A%0A%20%20Utils%2EmouseAndTouchNormalize%28evt%2C%20this%2Esvg%29%0A%0A%20%20%2F%2F%20Double%20click%20detection%3B%20more%20consistent%20than%20ondblclick%0A%20%20if%20%28this%2Eoptions%2EdblClickZoomEnabled%20%26%26%20Utils%2EisDblClick%28evt%2C%20prevEvt%29%29%7B%0A%20%20%20%20this%2EhandleDblClick%28evt%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20%2F%2F%20Pan%20mode%0A%20%20%20%20this%2Estate%20%3D%20%27pan%27%0A%20%20%20%20this%2EfirstEventCTM%20%3D%20this%2Eviewport%2EgetCTM%28%29%0A%20%20%20%20this%2EstateOrigin%20%3D%20SvgUtils%2EgetEventPoint%28evt%2C%20this%2Esvg%29%2EmatrixTransform%28this%2EfirstEventCTM%2Einverse%28%29%29%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Handle%20mouse%20move%20event%0A%20%2A%0A%20%2A%20%40param%20%20%7BEvent%7D%20evt%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EhandleMouseMove%20%3D%20function%28evt%29%20%7B%0A%20%20if%20%28evt%2EpreventDefault%29%20%7B%0A%20%20%20%20evt%2EpreventDefault%28%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20evt%2EreturnValue%20%3D%20false%0A%20%20%7D%0A%0A%20%20if%20%28this%2Estate%20%3D%3D%3D%20%27pan%27%20%26%26%20this%2Eoptions%2EpanEnabled%29%20%7B%0A%20%20%20%20%2F%2F%20Pan%20mode%0A%20%20%20%20var%20point%20%3D%20SvgUtils%2EgetEventPoint%28evt%2C%20this%2Esvg%29%2EmatrixTransform%28this%2EfirstEventCTM%2Einverse%28%29%29%0A%20%20%20%20%20%20%2C%20viewportCTM%20%3D%20this%2EfirstEventCTM%2Etranslate%28point%2Ex%20%2D%20this%2EstateOrigin%2Ex%2C%20point%2Ey%20%2D%20this%2EstateOrigin%2Ey%29%0A%0A%20%20%20%20this%2Eviewport%2EsetCTM%28viewportCTM%29%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Handle%20mouse%20button%20release%20event%0A%20%2A%0A%20%2A%20%40param%20%7BEvent%7D%20evt%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EhandleMouseUp%20%3D%20function%28evt%29%20%7B%0A%20%20if%20%28evt%2EpreventDefault%29%20%7B%0A%20%20%20%20evt%2EpreventDefault%28%29%0A%20%20%7D%20else%20%7B%0A%20%20%20%20evt%2EreturnValue%20%3D%20false%0A%20%20%7D%0A%0A%20%20if%20%28this%2Estate%20%3D%3D%3D%20%27pan%27%29%20%7B%0A%20%20%20%20%2F%2F%20Quit%20pan%20mode%0A%20%20%20%20this%2Estate%20%3D%20%27none%27%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Adjust%20viewport%20size%20%28only%29%20so%20it%20will%20fit%20in%20SVG%0A%20%2A%20Does%20not%20center%20image%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Efit%20%3D%20function%28%29%20%7B%0A%20%20var%20viewBox%20%3D%20this%2Eviewport%2EgetViewBox%28%29%0A%20%20%20%20%2C%20newScale%20%3D%20Math%2Emin%28this%2Ewidth%2F%28viewBox%2Ewidth%20%2D%20viewBox%2Ex%29%2C%20this%2Eheight%2F%28viewBox%2Eheight%20%2D%20viewBox%2Ey%29%29%0A%0A%20%20this%2Ezoom%28newScale%2C%20true%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Adjust%20viewport%20pan%20%28only%29%20so%20it%20will%20be%20centered%20in%20SVG%0A%20%2A%20Does%20not%20zoom%2Ffit%20image%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Ecenter%20%3D%20function%28%29%20%7B%0A%20%20var%20viewBox%20%3D%20this%2Eviewport%2EgetViewBox%28%29%0A%20%20%20%20%2C%20offsetX%20%3D%20%28this%2Ewidth%20%2D%20%28viewBox%2Ewidth%20%2B%20viewBox%2Ex%29%20%2A%20this%2EgetZoom%28%29%29%20%2A%200%2E5%0A%20%20%20%20%2C%20offsetY%20%3D%20%28this%2Eheight%20%2D%20%28viewBox%2Eheight%20%2B%20viewBox%2Ey%29%20%2A%20this%2EgetZoom%28%29%29%20%2A%200%2E5%0A%0A%20%20this%2EgetPublicInstance%28%29%2Epan%28%7Bx%3A%20offsetX%2C%20y%3A%20offsetY%7D%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Update%20content%20cached%20BorderBox%0A%20%2A%20Use%20when%20viewport%20contents%20change%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EupdateBBox%20%3D%20function%28%29%20%7B%0A%20%20this%2Eviewport%2ErecacheViewBox%28%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Pan%20to%20a%20rendered%20position%0A%20%2A%0A%20%2A%20%40param%20%20%7BObject%7D%20point%20%7Bx%3A%200%2C%20y%3A%200%7D%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Epan%20%3D%20function%28point%29%20%7B%0A%20%20var%20viewportCTM%20%3D%20this%2Eviewport%2EgetCTM%28%29%0A%20%20viewportCTM%2Ee%20%3D%20point%2Ex%0A%20%20viewportCTM%2Ef%20%3D%20point%2Ey%0A%20%20this%2Eviewport%2EsetCTM%28viewportCTM%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Relatively%20pan%20the%20graph%20by%20a%20specified%20rendered%20position%20vector%0A%20%2A%0A%20%2A%20%40param%20%20%7BObject%7D%20point%20%7Bx%3A%200%2C%20y%3A%200%7D%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EpanBy%20%3D%20function%28point%29%20%7B%0A%20%20var%20viewportCTM%20%3D%20this%2Eviewport%2EgetCTM%28%29%0A%20%20viewportCTM%2Ee%20%2B%3D%20point%2Ex%0A%20%20viewportCTM%2Ef%20%2B%3D%20point%2Ey%0A%20%20this%2Eviewport%2EsetCTM%28viewportCTM%29%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Get%20pan%20vector%0A%20%2A%0A%20%2A%20%40return%20%7BObject%7D%20%7Bx%3A%200%2C%20y%3A%200%7D%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EgetPan%20%3D%20function%28%29%20%7B%0A%20%20var%20state%20%3D%20this%2Eviewport%2EgetState%28%29%0A%0A%20%20return%20%7Bx%3A%20state%2Ex%2C%20y%3A%20state%2Ey%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Recalculates%20cached%20svg%20dimensions%20and%20controls%20position%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Eresize%20%3D%20function%28%29%20%7B%0A%20%20%2F%2F%20Get%20dimensions%0A%20%20var%20boundingClientRectNormalized%20%3D%20SvgUtils%2EgetBoundingClientRectNormalized%28this%2Esvg%29%0A%20%20this%2Ewidth%20%3D%20boundingClientRectNormalized%2Ewidth%0A%20%20this%2Eheight%20%3D%20boundingClientRectNormalized%2Eheight%0A%0A%20%20%2F%2F%20Reposition%20control%20icons%20by%20re%2Denabling%20them%0A%20%20if%20%28this%2Eoptions%2EcontrolIconsEnabled%29%20%7B%0A%20%20%20%20this%2EgetPublicInstance%28%29%2EdisableControlIcons%28%29%0A%20%20%20%20this%2EgetPublicInstance%28%29%2EenableControlIcons%28%29%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Unbind%20mouse%20events%2C%20free%20callbacks%20and%20destroy%20public%20instance%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2Edestroy%20%3D%20function%28%29%20%7B%0A%20%20var%20that%20%3D%20this%0A%0A%20%20%2F%2F%20Free%20callbacks%0A%20%20this%2EbeforeZoom%20%3D%20null%0A%20%20this%2EonZoom%20%3D%20null%0A%20%20this%2EbeforePan%20%3D%20null%0A%20%20this%2EonPan%20%3D%20null%0A%0A%20%20%2F%2F%20Destroy%20custom%20event%20handlers%0A%20%20if%20%28this%2Eoptions%2EcustomEventsHandler%20%21%3D%20null%29%20%7B%20%2F%2F%20jshint%20ignore%3Aline%0A%20%20%20%20this%2Eoptions%2EcustomEventsHandler%2Edestroy%28%7B%0A%20%20%20%20%20%20svgElement%3A%20this%2Esvg%0A%20%20%20%20%2C%20instance%3A%20this%2EgetPublicInstance%28%29%0A%20%20%20%20%7D%29%0A%20%20%7D%0A%0A%20%20%2F%2F%20Unbind%20eventListeners%0A%20%20for%20%28var%20event%20in%20this%2EeventListeners%29%20%7B%0A%20%20%20%20this%2Esvg%2EremoveEventListener%28event%2C%20this%2EeventListeners%5Bevent%5D%2C%20false%29%0A%20%20%7D%0A%0A%20%20%2F%2F%20Unbind%20wheelListener%0A%20%20this%2EdisableMouseWheelZoom%28%29%0A%0A%20%20%2F%2F%20Remove%20control%20icons%0A%20%20this%2EgetPublicInstance%28%29%2EdisableControlIcons%28%29%0A%0A%20%20%2F%2F%20Reset%20zoom%20and%20pan%0A%20%20this%2Ereset%28%29%0A%0A%20%20%2F%2F%20Remove%20instance%20from%20instancesStore%0A%20%20instancesStore%20%3D%20instancesStore%2Efilter%28function%28instance%29%7B%0A%20%20%20%20return%20instance%2Esvg%20%21%3D%3D%20that%2Esvg%0A%20%20%7D%29%0A%0A%20%20%2F%2F%20Delete%20options%20and%20its%20contents%0A%20%20delete%20this%2Eoptions%0A%0A%20%20%2F%2F%20Destroy%20public%20instance%20and%20rewrite%20getPublicInstance%0A%20%20delete%20this%2EpublicInstance%0A%20%20delete%20this%2Epi%0A%20%20this%2EgetPublicInstance%20%3D%20function%28%29%7B%0A%20%20%20%20return%20null%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Returns%20a%20public%20instance%20object%0A%20%2A%0A%20%2A%20%40return%20%7BObject%7D%20Public%20instance%20object%0A%20%2A%2F%0ASvgPanZoom%2Eprototype%2EgetPublicInstance%20%3D%20function%28%29%20%7B%0A%20%20var%20that%20%3D%20this%0A%0A%20%20%2F%2F%20Create%20cache%0A%20%20if%20%28%21this%2EpublicInstance%29%20%7B%0A%20%20%20%20this%2EpublicInstance%20%3D%20this%2Epi%20%3D%20%7B%0A%20%20%20%20%20%20%2F%2F%20Pan%0A%20%20%20%20%20%20enablePan%3A%20function%28%29%20%7Bthat%2Eoptions%2EpanEnabled%20%3D%20true%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20disablePan%3A%20function%28%29%20%7Bthat%2Eoptions%2EpanEnabled%20%3D%20false%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20isPanEnabled%3A%20function%28%29%20%7Breturn%20%21%21that%2Eoptions%2EpanEnabled%7D%0A%20%20%20%20%2C%20pan%3A%20function%28point%29%20%7Bthat%2Epan%28point%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20panBy%3A%20function%28point%29%20%7Bthat%2EpanBy%28point%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20getPan%3A%20function%28%29%20%7Breturn%20that%2EgetPan%28%29%7D%0A%20%20%20%20%20%20%2F%2F%20Pan%20event%0A%20%20%20%20%2C%20setBeforePan%3A%20function%28fn%29%20%7Bthat%2Eoptions%2EbeforePan%20%3D%20fn%20%3D%3D%3D%20null%20%3F%20null%20%3A%20Utils%2Eproxy%28fn%2C%20that%2EpublicInstance%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20setOnPan%3A%20function%28fn%29%20%7Bthat%2Eoptions%2EonPan%20%3D%20fn%20%3D%3D%3D%20null%20%3F%20null%20%3A%20Utils%2Eproxy%28fn%2C%20that%2EpublicInstance%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%20%20%2F%2F%20Zoom%20and%20Control%20Icons%0A%20%20%20%20%2C%20enableZoom%3A%20function%28%29%20%7Bthat%2Eoptions%2EzoomEnabled%20%3D%20true%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20disableZoom%3A%20function%28%29%20%7Bthat%2Eoptions%2EzoomEnabled%20%3D%20false%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20isZoomEnabled%3A%20function%28%29%20%7Breturn%20%21%21that%2Eoptions%2EzoomEnabled%7D%0A%20%20%20%20%2C%20enableControlIcons%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%21that%2Eoptions%2EcontrolIconsEnabled%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20that%2Eoptions%2EcontrolIconsEnabled%20%3D%20true%0A%20%20%20%20%20%20%20%20%20%20ControlIcons%2Eenable%28that%29%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20that%2Epi%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%2C%20disableControlIcons%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28that%2Eoptions%2EcontrolIconsEnabled%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20that%2Eoptions%2EcontrolIconsEnabled%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20ControlIcons%2Edisable%28that%29%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20that%2Epi%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%2C%20isControlIconsEnabled%3A%20function%28%29%20%7Breturn%20%21%21that%2Eoptions%2EcontrolIconsEnabled%7D%0A%20%20%20%20%20%20%2F%2F%20Double%20click%20zoom%0A%20%20%20%20%2C%20enableDblClickZoom%3A%20function%28%29%20%7Bthat%2Eoptions%2EdblClickZoomEnabled%20%3D%20true%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20disableDblClickZoom%3A%20function%28%29%20%7Bthat%2Eoptions%2EdblClickZoomEnabled%20%3D%20false%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20isDblClickZoomEnabled%3A%20function%28%29%20%7Breturn%20%21%21that%2Eoptions%2EdblClickZoomEnabled%7D%0A%20%20%20%20%20%20%2F%2F%20Mouse%20wheel%20zoom%0A%20%20%20%20%2C%20enableMouseWheelZoom%3A%20function%28%29%20%7Bthat%2EenableMouseWheelZoom%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20disableMouseWheelZoom%3A%20function%28%29%20%7Bthat%2EdisableMouseWheelZoom%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20isMouseWheelZoomEnabled%3A%20function%28%29%20%7Breturn%20%21%21that%2Eoptions%2EmouseWheelZoomEnabled%7D%0A%20%20%20%20%20%20%2F%2F%20Zoom%20scale%20and%20bounds%0A%20%20%20%20%2C%20setZoomScaleSensitivity%3A%20function%28scale%29%20%7Bthat%2Eoptions%2EzoomScaleSensitivity%20%3D%20scale%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20setMinZoom%3A%20function%28zoom%29%20%7Bthat%2Eoptions%2EminZoom%20%3D%20zoom%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20setMaxZoom%3A%20function%28zoom%29%20%7Bthat%2Eoptions%2EmaxZoom%20%3D%20zoom%3B%20return%20that%2Epi%7D%0A%20%20%20%20%20%20%2F%2F%20Zoom%20event%0A%20%20%20%20%2C%20setBeforeZoom%3A%20function%28fn%29%20%7Bthat%2Eoptions%2EbeforeZoom%20%3D%20fn%20%3D%3D%3D%20null%20%3F%20null%20%3A%20Utils%2Eproxy%28fn%2C%20that%2EpublicInstance%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20setOnZoom%3A%20function%28fn%29%20%7Bthat%2Eoptions%2EonZoom%20%3D%20fn%20%3D%3D%3D%20null%20%3F%20null%20%3A%20Utils%2Eproxy%28fn%2C%20that%2EpublicInstance%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%20%20%2F%2F%20Zooming%0A%20%20%20%20%2C%20zoom%3A%20function%28scale%29%20%7Bthat%2EpublicZoom%28scale%2C%20true%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20zoomBy%3A%20function%28scale%29%20%7Bthat%2EpublicZoom%28scale%2C%20false%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20zoomAtPoint%3A%20function%28scale%2C%20point%29%20%7Bthat%2EpublicZoomAtPoint%28scale%2C%20point%2C%20true%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20zoomAtPointBy%3A%20function%28scale%2C%20point%29%20%7Bthat%2EpublicZoomAtPoint%28scale%2C%20point%2C%20false%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20zoomIn%3A%20function%28%29%20%7Bthis%2EzoomBy%281%20%2B%20that%2Eoptions%2EzoomScaleSensitivity%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20zoomOut%3A%20function%28%29%20%7Bthis%2EzoomBy%281%20%2F%20%281%20%2B%20that%2Eoptions%2EzoomScaleSensitivity%29%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20getZoom%3A%20function%28%29%20%7Breturn%20that%2EgetRelativeZoom%28%29%7D%0A%20%20%20%20%20%20%2F%2F%20Reset%0A%20%20%20%20%2C%20resetZoom%3A%20function%28%29%20%7Bthat%2EresetZoom%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20resetPan%3A%20function%28%29%20%7Bthat%2EresetPan%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20reset%3A%20function%28%29%20%7Bthat%2Ereset%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%20%20%2F%2F%20Fit%20and%20Center%0A%20%20%20%20%2C%20fit%3A%20function%28%29%20%7Bthat%2Efit%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20center%3A%20function%28%29%20%7Bthat%2Ecenter%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%20%20%2F%2F%20Size%20and%20Resize%0A%20%20%20%20%2C%20updateBBox%3A%20function%28%29%20%7Bthat%2EupdateBBox%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20resize%3A%20function%28%29%20%7Bthat%2Eresize%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%2C%20getSizes%3A%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20width%3A%20that%2Ewidth%0A%20%20%20%20%20%20%20%20%2C%20height%3A%20that%2Eheight%0A%20%20%20%20%20%20%20%20%2C%20realZoom%3A%20that%2EgetZoom%28%29%0A%20%20%20%20%20%20%20%20%2C%20viewBox%3A%20that%2Eviewport%2EgetViewBox%28%29%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20Destroy%0A%20%20%20%20%2C%20destroy%3A%20function%28%29%20%7Bthat%2Edestroy%28%29%3B%20return%20that%2Epi%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20return%20this%2EpublicInstance%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Stores%20pairs%20of%20instances%20of%20SvgPanZoom%20and%20SVG%0A%20%2A%20Each%20pair%20is%20represented%20by%20an%20object%20%7Bsvg%3A%20SVGSVGElement%2C%20instance%3A%20SvgPanZoom%7D%0A%20%2A%0A%20%2A%20%40type%20%7BArray%7D%0A%20%2A%2F%0Avar%20instancesStore%20%3D%20%5B%5D%0A%0Avar%20svgPanZoom%20%3D%20function%28elementOrSelector%2C%20options%29%7B%0A%20%20var%20svg%20%3D%20Utils%2EgetSvg%28elementOrSelector%29%0A%0A%20%20if%20%28svg%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20return%20null%0A%20%20%7D%20else%20%7B%0A%20%20%20%20%2F%2F%20Look%20for%20existent%20instance%0A%20%20%20%20for%28var%20i%20%3D%20instancesStore%2Elength%20%2D%201%3B%20i%20%3E%3D%200%3B%20i%2D%2D%29%20%7B%0A%20%20%20%20%20%20if%20%28instancesStore%5Bi%5D%2Esvg%20%3D%3D%3D%20svg%29%20%7B%0A%20%20%20%20%20%20%20%20return%20instancesStore%5Bi%5D%2Einstance%2EgetPublicInstance%28%29%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20If%20instance%20not%20found%20%2D%20create%20one%0A%20%20%20%20instancesStore%2Epush%28%7B%0A%20%20%20%20%20%20svg%3A%20svg%0A%20%20%20%20%2C%20instance%3A%20new%20SvgPanZoom%28svg%2C%20options%29%0A%20%20%20%20%7D%29%0A%0A%20%20%20%20%2F%2F%20Return%20just%20pushed%20instance%0A%20%20%20%20return%20instancesStore%5BinstancesStore%2Elength%20%2D%201%5D%2Einstance%2EgetPublicInstance%28%29%0A%20%20%7D%0A%7D%0A%0Amodule%2Eexports%20%3D%20svgPanZoom%3B%0A%0A%7D%2C%7B%22%2E%2Fcontrol%2Dicons%22%3A3%2C%22%2E%2Fshadow%2Dviewport%22%3A4%2C%22%2E%2Fsvg%2Dutilities%22%3A6%2C%22%2E%2Futilities%22%3A7%2C%22uniwheel%22%3A2%7D%5D%2C6%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0Avar%20Utils%20%3D%20require%28%27%2E%2Futilities%27%29%0A%20%20%2C%20%5Fbrowser%20%3D%20%27unknown%27%0A%20%20%3B%0A%0A%2F%2F%20http%3A%2F%2Fstackoverflow%2Ecom%2Fquestions%2F9847580%2Fhow%2Dto%2Ddetect%2Dsafari%2Dchrome%2Die%2Dfirefox%2Dand%2Dopera%2Dbrowser%0Aif%20%28%2F%2A%40cc%5Fon%21%40%2A%2Ffalse%20%7C%7C%20%21%21document%2EdocumentMode%29%20%7B%20%2F%2F%20internet%20explorer%0A%20%20%5Fbrowser%20%3D%20%27ie%27%3B%0A%7D%0A%0Amodule%2Eexports%20%3D%20%7B%0A%20%20svgNS%3A%20%20%27http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%27%0A%2C%20xmlNS%3A%20%20%27http%3A%2F%2Fwww%2Ew3%2Eorg%2FXML%2F1998%2Fnamespace%27%0A%2C%20xmlnsNS%3A%20%20%27http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fxmlns%2F%27%0A%2C%20xlinkNS%3A%20%20%27http%3A%2F%2Fwww%2Ew3%2Eorg%2F1999%2Fxlink%27%0A%2C%20evNS%3A%20%20%27http%3A%2F%2Fwww%2Ew3%2Eorg%2F2001%2Fxml%2Devents%27%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Get%20svg%20dimensions%3A%20width%20and%20height%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%20%40return%20%7BObject%7D%20%20%20%20%20%7Bwidth%3A%200%2C%20height%3A%200%7D%0A%20%20%20%2A%2F%0A%2C%20getBoundingClientRectNormalized%3A%20function%28svg%29%20%7B%0A%20%20%20%20if%20%28svg%2EclientWidth%20%26%26%20svg%2EclientHeight%29%20%7B%0A%20%20%20%20%20%20return%20%7Bwidth%3A%20svg%2EclientWidth%2C%20height%3A%20svg%2EclientHeight%7D%0A%20%20%20%20%7D%20else%20if%20%28%21%21svg%2EgetBoundingClientRect%28%29%29%20%7B%0A%20%20%20%20%20%20return%20svg%2EgetBoundingClientRect%28%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20throw%20new%20Error%28%27Cannot%20get%20BoundingClientRect%20for%20SVG%2E%27%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Gets%20g%20element%20with%20class%20of%20%22viewport%22%20or%20creates%20it%20if%20it%20doesn%27t%20exist%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%20%40return%20%7BSVGElement%7D%20%20%20%20%20g%20%28group%29%20element%0A%20%20%20%2A%2F%0A%2C%20getOrCreateViewport%3A%20function%28svg%2C%20selector%29%20%7B%0A%20%20%20%20var%20viewport%20%3D%20null%0A%0A%20%20%20%20if%20%28Utils%2EisElement%28selector%29%29%20%7B%0A%20%20%20%20%20%20viewport%20%3D%20selector%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20viewport%20%3D%20svg%2EquerySelector%28selector%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Check%20if%20there%20is%20just%20one%20main%20group%20in%20SVG%0A%20%20%20%20if%20%28%21viewport%29%20%7B%0A%20%20%20%20%20%20var%20childNodes%20%3D%20Array%2Eprototype%2Eslice%2Ecall%28svg%2EchildNodes%20%7C%7C%20svg%2Echildren%29%2Efilter%28function%28el%29%7B%0A%20%20%20%20%20%20%20%20return%20el%2EnodeName%20%21%3D%3D%20%27defs%27%20%26%26%20el%2EnodeName%20%21%3D%3D%20%27%23text%27%0A%20%20%20%20%20%20%7D%29%0A%0A%20%20%20%20%20%20%2F%2F%20Node%20name%20should%20be%20SVGGElement%20and%20should%20have%20no%20transform%20attribute%0A%20%20%20%20%20%20%2F%2F%20Groups%20with%20transform%20are%20not%20used%20as%20viewport%20because%20it%20involves%20parsing%20of%20all%20transform%20possibilities%0A%20%20%20%20%20%20if%20%28childNodes%2Elength%20%3D%3D%3D%201%20%26%26%20childNodes%5B0%5D%2EnodeName%20%3D%3D%3D%20%27g%27%20%26%26%20childNodes%5B0%5D%2EgetAttribute%28%27transform%27%29%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20viewport%20%3D%20childNodes%5B0%5D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20If%20no%20favorable%20group%20element%20exists%20then%20create%20one%0A%20%20%20%20if%20%28%21viewport%29%20%7B%0A%20%20%20%20%20%20var%20viewportId%20%3D%20%27viewport%2D%27%20%2B%20new%20Date%28%29%2EtoISOString%28%29%2Ereplace%28%2F%5CD%2Fg%2C%20%27%27%29%3B%0A%20%20%20%20%20%20viewport%20%3D%20document%2EcreateElementNS%28this%2EsvgNS%2C%20%27g%27%29%3B%0A%20%20%20%20%20%20viewport%2EsetAttribute%28%27id%27%2C%20viewportId%29%3B%0A%0A%20%20%20%20%20%20%2F%2F%20Internet%20Explorer%20%28all%20versions%3F%29%20can%27t%20use%20childNodes%2C%20but%20other%20browsers%20prefer%20%28require%3F%29%20using%20childNodes%0A%20%20%20%20%20%20var%20svgChildren%20%3D%20svg%2EchildNodes%20%7C%7C%20svg%2Echildren%3B%0A%20%20%20%20%20%20if%20%28%21%21svgChildren%20%26%26%20svgChildren%2Elength%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20for%20%28var%20i%20%3D%20svgChildren%2Elength%3B%20i%20%3E%200%3B%20i%2D%2D%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20Move%20everything%20into%20viewport%20except%20defs%0A%20%20%20%20%20%20%20%20%20%20if%20%28svgChildren%5BsvgChildren%2Elength%20%2D%20i%5D%2EnodeName%20%21%3D%3D%20%27defs%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20viewport%2EappendChild%28svgChildren%5BsvgChildren%2Elength%20%2D%20i%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20svg%2EappendChild%28viewport%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Parse%20class%20names%0A%20%20%20%20var%20classNames%20%3D%20%5B%5D%3B%0A%20%20%20%20if%20%28viewport%2EgetAttribute%28%27class%27%29%29%20%7B%0A%20%20%20%20%20%20classNames%20%3D%20viewport%2EgetAttribute%28%27class%27%29%2Esplit%28%27%20%27%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Set%20class%20%28if%20not%20set%20already%29%0A%20%20%20%20if%20%28%21%7EclassNames%2EindexOf%28%27svg%2Dpan%2Dzoom%5Fviewport%27%29%29%20%7B%0A%20%20%20%20%20%20classNames%2Epush%28%27svg%2Dpan%2Dzoom%5Fviewport%27%29%0A%20%20%20%20%20%20viewport%2EsetAttribute%28%27class%27%2C%20classNames%2Ejoin%28%27%20%27%29%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20viewport%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Set%20SVG%20attributes%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%2F%0A%20%20%2C%20setupSvgAttributes%3A%20function%28svg%29%20%7B%0A%20%20%20%20%2F%2F%20Setting%20default%20attributes%0A%20%20%20%20svg%2EsetAttribute%28%27xmlns%27%2C%20this%2EsvgNS%29%3B%0A%20%20%20%20svg%2EsetAttributeNS%28this%2ExmlnsNS%2C%20%27xmlns%3Axlink%27%2C%20this%2ExlinkNS%29%3B%0A%20%20%20%20svg%2EsetAttributeNS%28this%2ExmlnsNS%2C%20%27xmlns%3Aev%27%2C%20this%2EevNS%29%3B%0A%0A%20%20%20%20%2F%2F%20Needed%20for%20Internet%20Explorer%2C%20otherwise%20the%20viewport%20overflows%0A%20%20%20%20if%20%28svg%2EparentNode%20%21%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20var%20style%20%3D%20svg%2EgetAttribute%28%27style%27%29%20%7C%7C%20%27%27%3B%0A%20%20%20%20%20%20if%20%28style%2EtoLowerCase%28%29%2EindexOf%28%27overflow%27%29%20%3D%3D%3D%20%2D1%29%20%7B%0A%20%20%20%20%20%20%20%20svg%2EsetAttribute%28%27style%27%2C%20%27overflow%3A%20hidden%3B%20%27%20%2B%20style%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%2F%2A%2A%0A%20%2A%20How%20long%20Internet%20Explorer%20takes%20to%20finish%20updating%20its%20display%20%28ms%29%2E%0A%20%2A%2F%0A%2C%20internetExplorerRedisplayInterval%3A%20300%0A%0A%2F%2A%2A%0A%20%2A%20Forces%20the%20browser%20to%20redisplay%20all%20SVG%20elements%20that%20rely%20on%20an%0A%20%2A%20element%20defined%20in%20a%20%27defs%27%20section%2E%20It%20works%20globally%2C%20for%20every%0A%20%2A%20available%20defs%20element%20on%20the%20page%2E%0A%20%2A%20The%20throttling%20is%20intentionally%20global%2E%0A%20%2A%0A%20%2A%20This%20is%20only%20needed%20for%20IE%2E%20It%20is%20as%20a%20hack%20to%20make%20markers%20%28and%20%27use%27%20elements%3F%29%0A%20%2A%20visible%20after%20pan%2Fzoom%20when%20there%20are%20multiple%20SVGs%20on%20the%20page%2E%0A%20%2A%20See%20bug%20report%3A%20https%3A%2F%2Fconnect%2Emicrosoft%2Ecom%2FIE%2Ffeedback%2Fdetails%2F781964%2F%0A%20%2A%20also%20see%20svg%2Dpan%2Dzoom%20issue%3A%20https%3A%2F%2Fgithub%2Ecom%2Fariutta%2Fsvg%2Dpan%2Dzoom%2Fissues%2F62%0A%20%2A%2F%0A%2C%20refreshDefsGlobal%3A%20Utils%2Ethrottle%28function%28%29%20%7B%0A%20%20%20%20var%20allDefs%20%3D%20document%2EquerySelectorAll%28%27defs%27%29%3B%0A%20%20%20%20var%20allDefsCount%20%3D%20allDefs%2Elength%3B%0A%20%20%20%20for%20%28var%20i%20%3D%200%3B%20i%20%3C%20allDefsCount%3B%20i%2B%2B%29%20%7B%0A%20%20%20%20%20%20var%20thisDefs%20%3D%20allDefs%5Bi%5D%3B%0A%20%20%20%20%20%20thisDefs%2EparentNode%2EinsertBefore%28thisDefs%2C%20thisDefs%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%2C%20this%2EinternetExplorerRedisplayInterval%29%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Sets%20the%20current%20transform%20matrix%20of%20an%20element%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%7BSVGElement%7D%20element%0A%20%20%20%2A%20%40param%20%7BSVGMatrix%7D%20matrix%20%20CTM%0A%20%20%20%2A%20%40param%20%7BSVGElement%7D%20defs%0A%20%20%20%2A%2F%0A%2C%20setCTM%3A%20function%28element%2C%20matrix%2C%20defs%29%20%7B%0A%20%20%20%20var%20that%20%3D%20this%0A%20%20%20%20%20%20%2C%20s%20%3D%20%27matrix%28%27%20%2B%20matrix%2Ea%20%2B%20%27%2C%27%20%2B%20matrix%2Eb%20%2B%20%27%2C%27%20%2B%20matrix%2Ec%20%2B%20%27%2C%27%20%2B%20matrix%2Ed%20%2B%20%27%2C%27%20%2B%20matrix%2Ee%20%2B%20%27%2C%27%20%2B%20matrix%2Ef%20%2B%20%27%29%27%3B%0A%0A%20%20%20%20element%2EsetAttributeNS%28null%2C%20%27transform%27%2C%20s%29%3B%0A%0A%20%20%20%20%2F%2F%20IE%20has%20a%20bug%20that%20makes%20markers%20disappear%20on%20zoom%20%28when%20the%20matrix%20%22a%22%20and%2For%20%22d%22%20elements%20change%29%0A%20%20%20%20%2F%2F%20see%20http%3A%2F%2Fstackoverflow%2Ecom%2Fquestions%2F17654578%2Fsvg%2Dmarker%2Ddoes%2Dnot%2Dwork%2Din%2Die9%2D10%0A%20%20%20%20%2F%2F%20and%20http%3A%2F%2Fsrndolha%2Ewordpress%2Ecom%2F2013%2F11%2F25%2Fsvg%2Dline%2Dmarkers%2Dmay%2Ddisappear%2Din%2Dinternet%2Dexplorer%2D11%2F%0A%20%20%20%20if%20%28%5Fbrowser%20%3D%3D%3D%20%27ie%27%20%26%26%20%21%21defs%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20this%20refresh%20is%20intended%20for%20redisplaying%20the%20SVG%20during%20zooming%0A%20%20%20%20%20%20defs%2EparentNode%2EinsertBefore%28defs%2C%20defs%29%3B%0A%20%20%20%20%20%20%2F%2F%20this%20refresh%20is%20intended%20for%20redisplaying%20the%20other%20SVGs%20on%20a%20page%20when%20panning%20a%20given%20SVG%0A%20%20%20%20%20%20%2F%2F%20it%20is%20also%20needed%20for%20the%20given%20SVG%20itself%2C%20on%20zoomEnd%2C%20if%20the%20SVG%20contains%20any%20markers%20that%0A%20%20%20%20%20%20%2F%2F%20are%20located%20under%20any%20other%20element%28s%29%2E%0A%20%20%20%20%20%20window%2EsetTimeout%28function%28%29%20%7B%0A%20%20%20%20%20%20%20%20that%2ErefreshDefsGlobal%28%29%3B%0A%20%20%20%20%20%20%7D%2C%20that%2EinternetExplorerRedisplayInterval%29%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Instantiate%20an%20SVGPoint%20object%20with%20given%20event%20coordinates%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%7BEvent%7D%20evt%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%20%40return%20%7BSVGPoint%7D%20%20%20%20%20point%0A%20%20%20%2A%2F%0A%2C%20getEventPoint%3A%20function%28evt%2C%20svg%29%20%7B%0A%20%20%20%20var%20point%20%3D%20svg%2EcreateSVGPoint%28%29%0A%0A%20%20%20%20Utils%2EmouseAndTouchNormalize%28evt%2C%20svg%29%0A%0A%20%20%20%20point%2Ex%20%3D%20evt%2EclientX%0A%20%20%20%20point%2Ey%20%3D%20evt%2EclientY%0A%0A%20%20%20%20return%20point%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Get%20SVG%20center%20point%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%20%40return%20%7BSVGPoint%7D%0A%20%20%20%2A%2F%0A%2C%20getSvgCenterPoint%3A%20function%28svg%2C%20width%2C%20height%29%20%7B%0A%20%20%20%20return%20this%2EcreateSVGPoint%28svg%2C%20width%20%2F%202%2C%20height%20%2F%202%29%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Create%20a%20SVGPoint%20with%20given%20x%20and%20y%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%20%40param%20%20%7BNumber%7D%20x%0A%20%20%20%2A%20%40param%20%20%7BNumber%7D%20y%0A%20%20%20%2A%20%40return%20%7BSVGPoint%7D%0A%20%20%20%2A%2F%0A%2C%20createSVGPoint%3A%20function%28svg%2C%20x%2C%20y%29%20%7B%0A%20%20%20%20var%20point%20%3D%20svg%2EcreateSVGPoint%28%29%0A%20%20%20%20point%2Ex%20%3D%20x%0A%20%20%20%20point%2Ey%20%3D%20y%0A%0A%20%20%20%20return%20point%0A%20%20%7D%0A%7D%0A%0A%7D%2C%7B%22%2E%2Futilities%22%3A7%7D%5D%2C7%3A%5Bfunction%28require%2Cmodule%2Cexports%29%7B%0Amodule%2Eexports%20%3D%20%7B%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Extends%20an%20object%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BObject%7D%20target%20object%20to%20extend%0A%20%20%20%2A%20%40param%20%20%7BObject%7D%20source%20object%20to%20take%20properties%20from%0A%20%20%20%2A%20%40return%20%7BObject%7D%20%20%20%20%20%20%20%20extended%20object%0A%20%20%20%2A%2F%0A%20%20extend%3A%20function%28target%2C%20source%29%20%7B%0A%20%20%20%20target%20%3D%20target%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20for%20%28var%20prop%20in%20source%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Go%20recursively%0A%20%20%20%20%20%20if%20%28this%2EisObject%28source%5Bprop%5D%29%29%20%7B%0A%20%20%20%20%20%20%20%20target%5Bprop%5D%20%3D%20this%2Eextend%28target%5Bprop%5D%2C%20source%5Bprop%5D%29%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20target%5Bprop%5D%20%3D%20source%5Bprop%5D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20return%20target%3B%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Checks%20if%20an%20object%20is%20a%20DOM%20element%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BObject%7D%20%20o%20HTML%20element%20or%20String%0A%20%20%20%2A%20%40return%20%7BBoolean%7D%20%20%20returns%20true%20if%20object%20is%20a%20DOM%20element%0A%20%20%20%2A%2F%0A%2C%20isElement%3A%20function%28o%29%7B%0A%20%20%20%20return%20%28%0A%20%20%20%20%20%20typeof%20HTMLElement%20%3D%3D%3D%20%27object%27%20%3F%20%28o%20instanceof%20HTMLElement%20%7C%7C%20o%20instanceof%20SVGElement%20%7C%7C%20o%20instanceof%20SVGSVGElement%29%20%3A%20%2F%2FDOM2%0A%20%20%20%20%20%20o%20%26%26%20typeof%20o%20%3D%3D%3D%20%27object%27%20%26%26%20o%20%21%3D%3D%20null%20%26%26%20o%2EnodeType%20%3D%3D%3D%201%20%26%26%20typeof%20o%2EnodeName%20%3D%3D%3D%20%27string%27%0A%20%20%20%20%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Checks%20if%20an%20object%20is%20an%20Object%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BObject%7D%20%20o%20Object%0A%20%20%20%2A%20%40return%20%7BBoolean%7D%20%20%20returns%20true%20if%20object%20is%20an%20Object%0A%20%20%20%2A%2F%0A%2C%20isObject%3A%20function%28o%29%7B%0A%20%20%20%20return%20Object%2Eprototype%2EtoString%2Ecall%28o%29%20%3D%3D%3D%20%27%5Bobject%20Object%5D%27%3B%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Checks%20if%20variable%20is%20Number%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BInteger%7CFloat%7D%20%20n%0A%20%20%20%2A%20%40return%20%7BBoolean%7D%20%20%20returns%20true%20if%20variable%20is%20Number%0A%20%20%20%2A%2F%0A%2C%20isNumber%3A%20function%28n%29%20%7B%0A%20%20%20%20return%20%21isNaN%28parseFloat%28n%29%29%20%26%26%20isFinite%28n%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Search%20for%20an%20SVG%20element%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BObject%7CString%7D%20elementOrSelector%20DOM%20Element%20or%20selector%20String%0A%20%20%20%2A%20%40return%20%7BObject%7CNull%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SVG%20or%20null%0A%20%20%20%2A%2F%0A%2C%20getSvg%3A%20function%28elementOrSelector%29%20%7B%0A%20%20%20%20var%20element%0A%20%20%20%20%20%20%2C%20svg%3B%0A%0A%20%20%20%20if%20%28%21this%2EisElement%28elementOrSelector%29%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20If%20selector%20provided%0A%20%20%20%20%20%20if%20%28typeof%20elementOrSelector%20%3D%3D%3D%20%27string%27%20%7C%7C%20elementOrSelector%20instanceof%20String%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Try%20to%20find%20the%20element%0A%20%20%20%20%20%20%20%20element%20%3D%20document%2EquerySelector%28elementOrSelector%29%0A%0A%20%20%20%20%20%20%20%20if%20%28%21element%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%27Provided%20selector%20did%20not%20find%20any%20elements%2E%20Selector%3A%20%27%20%2B%20elementOrSelector%29%0A%20%20%20%20%20%20%20%20%20%20return%20null%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20throw%20new%20Error%28%27Provided%20selector%20is%20not%20an%20HTML%20object%20nor%20String%27%29%0A%20%20%20%20%20%20%20%20return%20null%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20element%20%3D%20elementOrSelector%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28element%2EtagName%2EtoLowerCase%28%29%20%3D%3D%3D%20%27svg%27%29%20%7B%0A%20%20%20%20%20%20svg%20%3D%20element%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20if%20%28element%2EtagName%2EtoLowerCase%28%29%20%3D%3D%3D%20%27object%27%29%20%7B%0A%20%20%20%20%20%20%20%20svg%20%3D%20element%2EcontentDocument%2EdocumentElement%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20if%20%28element%2EtagName%2EtoLowerCase%28%29%20%3D%3D%3D%20%27embed%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20svg%20%3D%20element%2EgetSVGDocument%28%29%2EdocumentElement%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20%28element%2EtagName%2EtoLowerCase%28%29%20%3D%3D%3D%20%27img%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%27Cannot%20script%20an%20SVG%20in%20an%20%22img%22%20element%2E%20Please%20use%20an%20%22object%22%20element%20or%20an%20in%2Dline%20SVG%2E%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Error%28%27Cannot%20get%20SVG%2E%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20return%20null%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%20svg%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Attach%20a%20given%20context%20to%20a%20function%0A%20%20%20%2A%20%40param%20%20%7BFunction%7D%20fn%20%20%20%20%20%20Function%0A%20%20%20%2A%20%40param%20%20%7BObject%7D%20%20%20context%20Context%0A%20%20%20%2A%20%40return%20%7BFunction%7D%20%20%20%20%20%20%20%20%20%20%20Function%20with%20certain%20context%0A%20%20%20%2A%2F%0A%2C%20proxy%3A%20function%28fn%2C%20context%29%20%7B%0A%20%20%20%20return%20function%28%29%20%7B%0A%20%20%20%20%20%20return%20fn%2Eapply%28context%2C%20arguments%29%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Returns%20object%20type%0A%20%20%20%2A%20Uses%20toString%20that%20returns%20%5Bobject%20SVGPoint%5D%0A%20%20%20%2A%20And%20than%20parses%20object%20type%20from%20string%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BObject%7D%20o%20Any%20object%0A%20%20%20%2A%20%40return%20%7BString%7D%20%20%20Object%20type%0A%20%20%20%2A%2F%0A%2C%20getType%3A%20function%28o%29%20%7B%0A%20%20%20%20return%20Object%2Eprototype%2EtoString%2Eapply%28o%29%2Ereplace%28%2F%5E%5C%5Bobject%5Cs%2F%2C%20%27%27%29%2Ereplace%28%2F%5C%5D%24%2F%2C%20%27%27%29%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20If%20it%20is%20a%20touch%20event%20than%20add%20clientX%20and%20clientY%20to%20event%20object%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BEvent%7D%20evt%0A%20%20%20%2A%20%40param%20%20%7BSVGSVGElement%7D%20svg%0A%20%20%20%2A%2F%0A%2C%20mouseAndTouchNormalize%3A%20function%28evt%2C%20svg%29%20%7B%0A%20%20%20%20%2F%2F%20If%20no%20cilentX%20and%20but%20touch%20objects%20are%20available%0A%20%20%20%20if%20%28evt%2EclientX%20%3D%3D%3D%20void%200%20%7C%7C%20evt%2EclientX%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20%2F%2F%20Fallback%0A%20%20%20%20%20%20evt%2EclientX%20%3D%200%0A%20%20%20%20%20%20evt%2EclientY%20%3D%200%0A%0A%20%20%20%20%20%20%2F%2F%20If%20it%20is%20a%20touch%20event%0A%20%20%20%20%20%20if%20%28evt%2EchangedTouches%20%21%3D%3D%20void%200%20%26%26%20evt%2EchangedTouches%2Elength%29%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20touch%20event%20has%20changedTouches%0A%20%20%20%20%20%20%20%20if%20%28evt%2EchangedTouches%5B0%5D%2EclientX%20%21%3D%3D%20void%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20evt%2EclientX%20%3D%20evt%2EchangedTouches%5B0%5D%2EclientX%0A%20%20%20%20%20%20%20%20%20%20evt%2EclientY%20%3D%20evt%2EchangedTouches%5B0%5D%2EclientY%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%2F%2F%20If%20changedTouches%20has%20pageX%20attribute%0A%20%20%20%20%20%20%20%20else%20if%20%28evt%2EchangedTouches%5B0%5D%2EpageX%20%21%3D%3D%20void%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20rect%20%3D%20svg%2EgetBoundingClientRect%28%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20evt%2EclientX%20%3D%20evt%2EchangedTouches%5B0%5D%2EpageX%20%2D%20rect%2Eleft%0A%20%20%20%20%20%20%20%20%20%20evt%2EclientY%20%3D%20evt%2EchangedTouches%5B0%5D%2EpageY%20%2D%20rect%2Etop%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%2F%2F%20If%20it%20is%20a%20custom%20event%0A%20%20%20%20%20%20%7D%20else%20if%20%28evt%2EoriginalEvent%20%21%3D%3D%20void%200%29%20%7B%0A%20%20%20%20%20%20%20%20if%20%28evt%2EoriginalEvent%2EclientX%20%21%3D%3D%20void%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20evt%2EclientX%20%3D%20evt%2EoriginalEvent%2EclientX%0A%20%20%20%20%20%20%20%20%20%20evt%2EclientY%20%3D%20evt%2EoriginalEvent%2EclientY%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Check%20if%20an%20event%20is%20a%20double%20click%2Ftap%0A%20%20%20%2A%20TODO%3A%20For%20touch%20gestures%20use%20a%20library%20%28hammer%2Ejs%29%20that%20takes%20in%20account%20other%20events%0A%20%20%20%2A%20%28touchmove%20and%20touchend%29%2E%20It%20should%20take%20in%20account%20tap%20duration%20and%20traveled%20distance%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BEvent%7D%20%20evt%0A%20%20%20%2A%20%40param%20%20%7BEvent%7D%20%20prevEvt%20Previous%20Event%0A%20%20%20%2A%20%40return%20%7BBoolean%7D%0A%20%20%20%2A%2F%0A%2C%20isDblClick%3A%20function%28evt%2C%20prevEvt%29%20%7B%0A%20%20%20%20%2F%2F%20Double%20click%20detected%20by%20browser%0A%20%20%20%20if%20%28evt%2Edetail%20%3D%3D%3D%202%29%20%7B%0A%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%0A%20%20%20%20%2F%2F%20Try%20to%20compare%20events%0A%20%20%20%20else%20if%20%28prevEvt%20%21%3D%3D%20void%200%20%26%26%20prevEvt%20%21%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20var%20timeStampDiff%20%3D%20evt%2EtimeStamp%20%2D%20prevEvt%2EtimeStamp%20%2F%2F%20should%20be%20lower%20than%20250%20ms%0A%20%20%20%20%20%20%20%20%2C%20touchesDistance%20%3D%20Math%2Esqrt%28Math%2Epow%28evt%2EclientX%20%2D%20prevEvt%2EclientX%2C%202%29%20%2B%20Math%2Epow%28evt%2EclientY%20%2D%20prevEvt%2EclientY%2C%202%29%29%0A%0A%20%20%20%20%20%20return%20timeStampDiff%20%3C%20250%20%26%26%20touchesDistance%20%3C%2010%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20Nothing%20found%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Returns%20current%20timestamp%20as%20an%20integer%0A%20%20%20%2A%0A%20%20%20%2A%20%40return%20%7BNumber%7D%0A%20%20%20%2A%2F%0A%2C%20now%3A%20Date%2Enow%20%7C%7C%20function%28%29%20%7B%0A%20%20%20%20return%20new%20Date%28%29%2EgetTime%28%29%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20From%20underscore%2E%0A%20%20%2F%2F%20Returns%20a%20function%2C%20that%2C%20when%20invoked%2C%20will%20only%20be%20triggered%20at%20most%20once%0A%20%20%2F%2F%20during%20a%20given%20window%20of%20time%2E%20Normally%2C%20the%20throttled%20function%20will%20run%0A%20%20%2F%2F%20as%20much%20as%20it%20can%2C%20without%20ever%20going%20more%20than%20once%20per%20%60wait%60%20duration%3B%0A%20%20%2F%2F%20but%20if%20you%27d%20like%20to%20disable%20the%20execution%20on%20the%20leading%20edge%2C%20pass%0A%20%20%2F%2F%20%60%7Bleading%3A%20false%7D%60%2E%20To%20disable%20execution%20on%20the%20trailing%20edge%2C%20ditto%2E%0A%2F%2F%20jscs%3Adisable%0A%2F%2F%20jshint%20ignore%3Astart%0A%2C%20throttle%3A%20function%28func%2C%20wait%2C%20options%29%20%7B%0A%20%20%20%20var%20that%20%3D%20this%3B%0A%20%20%20%20var%20context%2C%20args%2C%20result%3B%0A%20%20%20%20var%20timeout%20%3D%20null%3B%0A%20%20%20%20var%20previous%20%3D%200%3B%0A%20%20%20%20if%20%28%21options%29%20options%20%3D%20%7B%7D%3B%0A%20%20%20%20var%20later%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20previous%20%3D%20options%2Eleading%20%3D%3D%3D%20false%20%3F%200%20%3A%20that%2Enow%28%29%3B%0A%20%20%20%20%20%20timeout%20%3D%20null%3B%0A%20%20%20%20%20%20result%20%3D%20func%2Eapply%28context%2C%20args%29%3B%0A%20%20%20%20%20%20if%20%28%21timeout%29%20context%20%3D%20args%20%3D%20null%3B%0A%20%20%20%20%7D%3B%0A%20%20%20%20return%20function%28%29%20%7B%0A%20%20%20%20%20%20var%20now%20%3D%20that%2Enow%28%29%3B%0A%20%20%20%20%20%20if%20%28%21previous%20%26%26%20options%2Eleading%20%3D%3D%3D%20false%29%20previous%20%3D%20now%3B%0A%20%20%20%20%20%20var%20remaining%20%3D%20wait%20%2D%20%28now%20%2D%20previous%29%3B%0A%20%20%20%20%20%20context%20%3D%20this%3B%0A%20%20%20%20%20%20args%20%3D%20arguments%3B%0A%20%20%20%20%20%20if%20%28remaining%20%3C%3D%200%20%7C%7C%20remaining%20%3E%20wait%29%20%7B%0A%20%20%20%20%20%20%20%20clearTimeout%28timeout%29%3B%0A%20%20%20%20%20%20%20%20timeout%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20previous%20%3D%20now%3B%0A%20%20%20%20%20%20%20%20result%20%3D%20func%2Eapply%28context%2C%20args%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21timeout%29%20context%20%3D%20args%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%20else%20if%20%28%21timeout%20%26%26%20options%2Etrailing%20%21%3D%3D%20false%29%20%7B%0A%20%20%20%20%20%20%20%20timeout%20%3D%20setTimeout%28later%2C%20remaining%29%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%2F%2F%20jshint%20ignore%3Aend%0A%2F%2F%20jscs%3Aenable%0A%0A%20%20%2F%2A%2A%0A%20%20%20%2A%20Create%20a%20requestAnimationFrame%20simulation%0A%20%20%20%2A%0A%20%20%20%2A%20%40param%20%20%7BNumber%7CString%7D%20refreshRate%0A%20%20%20%2A%20%40return%20%7BFunction%7D%0A%20%20%20%2A%2F%0A%2C%20createRequestAnimationFrame%3A%20function%28refreshRate%29%20%7B%0A%20%20%20%20var%20timeout%20%3D%20null%0A%0A%20%20%20%20%2F%2F%20Convert%20refreshRate%20to%20timeout%0A%20%20%20%20if%20%28refreshRate%20%21%3D%3D%20%27auto%27%20%26%26%20refreshRate%20%3C%2060%20%26%26%20refreshRate%20%3E%201%29%20%7B%0A%20%20%20%20%20%20timeout%20%3D%20Math%2Efloor%281000%20%2F%20refreshRate%29%0A%20%20%20%20%7D%0A%0A%20%20%20%20if%20%28timeout%20%3D%3D%3D%20null%29%20%7B%0A%20%20%20%20%20%20return%20window%2ErequestAnimationFrame%20%7C%7C%20requestTimeout%2833%29%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20requestTimeout%28timeout%29%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A%0A%2F%2A%2A%0A%20%2A%20Create%20a%20callback%20that%20will%20execute%20after%20a%20given%20timeout%0A%20%2A%0A%20%2A%20%40param%20%20%7BFunction%7D%20timeout%0A%20%2A%20%40return%20%7BFunction%7D%0A%20%2A%2F%0Afunction%20requestTimeout%28timeout%29%20%7B%0A%20%20return%20function%28callback%29%20%7B%0A%20%20%20%20window%2EsetTimeout%28callback%2C%20timeout%29%0A%20%20%7D%0A%7D%0A%0A%7D%2C%7B%7D%5D%7D%2C%7B%7D%2C%5B1%5D%29%3B%0A"></script>
<script src="data:application/x-javascript,HTMLWidgets%2Ewidget%28%7B%0A%0A%20%20name%3A%20%27svgPanZoom%27%2C%0A%0A%20%20type%3A%20%27output%27%2C%0A%0A%20%20initialize%3A%20function%28el%2C%20width%2C%20height%29%20%7B%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%2F%2F%20TODO%3A%20add%20instance%20fields%20as%20required%0A%20%20%20%20%7D%0A%0A%20%20%7D%2C%0A%0A%20%20renderValue%3A%20function%28el%2C%20x%2C%20instance%29%20%7B%0A%20%20%20%20%2F%2F%20set%20innerHTML%20equal%20to%20the%20SVG%20provided%20by%20R%20as%20x%2Esvg%0A%20%20%20%20%2F%2F%20%20for%20better%20robustness%2C%20create%20DOM%20element%20separately%0A%20%20%20%20%2F%2F%20%20and%20add%20to%20the%20htmlwidgets%20container%20el%0A%20%20%20%20el%2EinnerHTML%20%3D%20x%2Esvg%3B%0A%0A%20%20%20%20var%20svg%20%3D%20el%2EgetElementsByTagName%28%22svg%22%29%5B0%5D%0A%0A%20%20%20%20%2F%2F%20use%20this%20to%20sort%20of%20make%20our%20diagram%20responsive%0A%20%20%20%20%2F%2F%20%20or%20at%20a%20minimum%20fit%20within%20the%20bounds%20set%20by%20htmlwidgets%0A%20%20%20%20%2F%2F%20%20for%20the%20parent%20container%0A%20%20%20%20function%20makeResponsive%28el%29%7B%0A%20%20%20%20%20%20%20var%20svg%20%3D%20el%2EgetElementsByTagName%28%22svg%22%29%5B0%5D%3B%0A%20%20%20%20%20%20%20if%28svg%29%7B%0A%20%20%20%20%20%20%20%20if%28svg%2Ewidth%29%20%7Bsvg%2EremoveAttribute%28%22width%22%29%7D%3B%0A%20%20%20%20%20%20%20%20if%28svg%2Eheight%29%20%7Bsvg%2EremoveAttribute%28%22height%22%29%7D%3B%0A%20%20%20%20%20%20%20%20svg%2Estyle%2Ewidth%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%20%20svg%2Estyle%2Eheight%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20makeResponsive%28el%29%3B%0A%0A%20%20%20%20instance%2EzoomWidget%20%3D%20svgPanZoom%28svg%2C%20x%2Econfig%29%3B%0A%20%20%20%20%2F%2F%20%20use%20expando%20property%20so%20we%20can%20access%20later%0A%20%20%20%20%2F%2F%20%20%20%20somewhere%20saw%20where%20expando%20can%20cause%20memory%20leak%20in%20IE%0A%20%20%20%20%2F%2F%20%20%20%20could%20also%20set%20in%20HTMLWidgets%2Ewidgets%5Bx%5D%20where%20matches%20el%0A%20%20%20%20el%2EzoomWidget%20%3D%20instance%2EzoomWidget%3B%0A%0A%20%20%7D%2C%0A%0A%20%20resize%3A%20function%28el%2C%20width%2C%20height%2C%20instance%29%20%7B%0A%0A%20%20%7D%0A%0A%7D%29%3B%0A"></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-438" style="width:500px;height:500px;" class="svgPanZoom"></div>
</div>
<script type="application/json" data-for="htmlwidget-438">{"x":{"svg":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"432pt\" height=\"432pt\" viewBox=\"0 0 432 432\" version=\"1.1\">\n <display xmlns:r=\"http://www.r-project.org\" usr=\"0.64,10.36,0.64,10.36\"><![CDATA[{\nplot(1:10, type = \"n\")\npoints(1:10, pch = \"j\", family = \"StateFace\")\n}\n]]></display>\n <defs>\n <g>\n <symbol overflow=\"visible\" id=\"glyph0-0\">\n <path style=\"stroke:none;\" d=\"M 6.292969 -1.054688 L 6.292969 0 L 0.378906 0 C 0.367188 -0.265625 0.410156 -0.519531 0.507813 -0.761719 C 0.65625 -1.164063 0.898438 -1.558594 1.230469 -1.953125 C 1.558594 -2.339844 2.035156 -2.792969 2.667969 -3.308594 C 3.636719 -4.101563 4.292969 -4.734375 4.636719 -5.203125 C 4.976563 -5.667969 5.148438 -6.105469 5.152344 -6.523438 C 5.148438 -6.957031 4.992188 -7.324219 4.683594 -7.625 C 4.371094 -7.921875 3.96875 -8.074219 3.46875 -8.074219 C 2.9375 -8.074219 2.511719 -7.914063 2.195313 -7.597656 C 1.878906 -7.277344 1.71875 -6.839844 1.714844 -6.28125 L 0.585938 -6.398438 C 0.664063 -7.238281 0.953125 -7.878906 1.457031 -8.320313 C 1.960938 -8.761719 2.640625 -8.980469 3.492188 -8.984375 C 4.347656 -8.980469 5.023438 -8.742188 5.527344 -8.269531 C 6.027344 -7.789063 6.28125 -7.199219 6.28125 -6.5 C 6.28125 -6.140625 6.207031 -5.789063 6.058594 -5.445313 C 5.910156 -5.09375 5.664063 -4.730469 5.328125 -4.351563 C 4.984375 -3.964844 4.421875 -3.441406 3.636719 -2.777344 C 2.976563 -2.222656 2.554688 -1.84375 2.367188 -1.648438 C 2.179688 -1.449219 2.023438 -1.253906 1.90625 -1.054688 Z M 6.292969 -1.054688 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-1\">\n <path style=\"stroke:none;\" d=\"M 4.039063 0 L 4.039063 -2.140625 L 0.160156 -2.140625 L 0.160156 -3.148438 L 4.242188 -8.949219 L 5.140625 -8.949219 L 5.140625 -3.148438 L 6.347656 -3.148438 L 6.347656 -2.140625 L 5.140625 -2.140625 L 5.140625 0 Z M 4.039063 -3.148438 L 4.039063 -7.183594 L 1.238281 -3.148438 Z M 4.039063 -3.148438 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-2\">\n <path style=\"stroke:none;\" d=\"M 6.21875 -6.757813 L 5.125 -6.671875 C 5.027344 -7.097656 4.890625 -7.410156 4.710938 -7.609375 C 4.414063 -7.921875 4.046875 -8.078125 3.613281 -8.082031 C 3.261719 -8.078125 2.953125 -7.980469 2.691406 -7.789063 C 2.339844 -7.53125 2.066406 -7.164063 1.871094 -6.683594 C 1.667969 -6.195313 1.566406 -5.503906 1.5625 -4.613281 C 1.824219 -5.011719 2.148438 -5.3125 2.53125 -5.511719 C 2.914063 -5.703125 3.3125 -5.800781 3.734375 -5.804688 C 4.464844 -5.800781 5.089844 -5.53125 5.605469 -4.996094 C 6.117188 -4.453125 6.375 -3.757813 6.378906 -2.90625 C 6.375 -2.34375 6.253906 -1.820313 6.015625 -1.339844 C 5.769531 -0.855469 5.4375 -0.484375 5.015625 -0.230469 C 4.59375 0.0273438 4.113281 0.152344 3.578125 0.152344 C 2.660156 0.152344 1.914063 -0.183594 1.335938 -0.855469 C 0.757813 -1.527344 0.46875 -2.636719 0.46875 -4.1875 C 0.46875 -5.914063 0.789063 -7.171875 1.429688 -7.960938 C 1.984375 -8.640625 2.734375 -8.980469 3.679688 -8.984375 C 4.382813 -8.980469 4.957031 -8.785156 5.410156 -8.390625 C 5.855469 -7.996094 6.125 -7.449219 6.21875 -6.757813 Z M 1.734375 -2.898438 C 1.734375 -2.519531 1.8125 -2.15625 1.972656 -1.8125 C 2.132813 -1.460938 2.359375 -1.199219 2.648438 -1.019531 C 2.9375 -0.839844 3.238281 -0.75 3.558594 -0.75 C 4.019531 -0.75 4.417969 -0.9375 4.753906 -1.3125 C 5.082031 -1.6875 5.25 -2.195313 5.253906 -2.839844 C 5.25 -3.453125 5.085938 -3.941406 4.757813 -4.300781 C 4.429688 -4.65625 4.015625 -4.832031 3.515625 -4.835938 C 3.015625 -4.832031 2.59375 -4.65625 2.25 -4.300781 C 1.90625 -3.941406 1.734375 -3.472656 1.734375 -2.898438 Z M 1.734375 -2.898438 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-3\">\n <path style=\"stroke:none;\" d=\"M 2.210938 -4.851563 C 1.75 -5.015625 1.414063 -5.253906 1.195313 -5.566406 C 0.976563 -5.875 0.867188 -6.242188 0.867188 -6.675781 C 0.867188 -7.324219 1.097656 -7.871094 1.566406 -8.316406 C 2.03125 -8.757813 2.65625 -8.980469 3.4375 -8.984375 C 4.214844 -8.980469 4.84375 -8.753906 5.320313 -8.304688 C 5.796875 -7.847656 6.035156 -7.296875 6.035156 -6.648438 C 6.035156 -6.230469 5.925781 -5.867188 5.707031 -5.5625 C 5.488281 -5.25 5.15625 -5.015625 4.71875 -4.851563 C 5.265625 -4.671875 5.683594 -4.382813 5.972656 -3.984375 C 6.253906 -3.585938 6.398438 -3.109375 6.402344 -2.558594 C 6.398438 -1.789063 6.128906 -1.144531 5.589844 -0.628906 C 5.046875 -0.105469 4.332031 0.152344 3.453125 0.152344 C 2.566406 0.152344 1.855469 -0.105469 1.316406 -0.628906 C 0.773438 -1.148438 0.503906 -1.800781 0.507813 -2.585938 C 0.503906 -3.164063 0.652344 -3.652344 0.949219 -4.050781 C 1.242188 -4.441406 1.660156 -4.710938 2.210938 -4.851563 Z M 1.988281 -6.714844 C 1.984375 -6.289063 2.121094 -5.941406 2.398438 -5.675781 C 2.667969 -5.40625 3.023438 -5.273438 3.460938 -5.273438 C 3.878906 -5.273438 4.226563 -5.40625 4.5 -5.671875 C 4.769531 -5.9375 4.902344 -6.261719 4.90625 -6.652344 C 4.902344 -7.050781 4.765625 -7.390625 4.488281 -7.667969 C 4.207031 -7.941406 3.859375 -8.078125 3.449219 -8.082031 C 3.027344 -8.078125 2.679688 -7.945313 2.402344 -7.675781 C 2.125 -7.40625 1.984375 -7.085938 1.988281 -6.714844 Z M 1.636719 -2.582031 C 1.632813 -2.265625 1.707031 -1.960938 1.859375 -1.671875 C 2.003906 -1.375 2.226563 -1.148438 2.519531 -0.992188 C 2.8125 -0.828125 3.128906 -0.75 3.46875 -0.75 C 3.992188 -0.75 4.421875 -0.917969 4.765625 -1.257813 C 5.105469 -1.59375 5.277344 -2.023438 5.28125 -2.546875 C 5.277344 -3.074219 5.101563 -3.511719 4.75 -3.855469 C 4.394531 -4.199219 3.953125 -4.371094 3.429688 -4.375 C 2.910156 -4.371094 2.484375 -4.199219 2.144531 -3.863281 C 1.804688 -3.519531 1.632813 -3.09375 1.636719 -2.582031 Z M 1.636719 -2.582031 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-4\">\n <path style=\"stroke:none;\" d=\"M 4.65625 0 L 3.558594 0 L 3.558594 -7 C 3.289063 -6.746094 2.941406 -6.492188 2.515625 -6.242188 C 2.085938 -5.988281 1.703125 -5.800781 1.359375 -5.675781 L 1.359375 -6.738281 C 1.972656 -7.027344 2.507813 -7.375 2.972656 -7.789063 C 3.429688 -8.195313 3.757813 -8.59375 3.949219 -8.984375 L 4.65625 -8.984375 Z M 4.65625 0 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-5\">\n <path style=\"stroke:none;\" d=\"M 0.519531 -4.414063 C 0.515625 -5.46875 0.625 -6.320313 0.84375 -6.964844 C 1.0625 -7.609375 1.386719 -8.105469 1.816406 -8.457031 C 2.246094 -8.804688 2.785156 -8.980469 3.4375 -8.984375 C 3.914063 -8.980469 4.335938 -8.886719 4.699219 -8.695313 C 5.058594 -8.5 5.355469 -8.21875 5.59375 -7.859375 C 5.828125 -7.492188 6.015625 -7.050781 6.152344 -6.527344 C 6.285156 -6.003906 6.351563 -5.296875 6.355469 -4.414063 C 6.351563 -3.359375 6.242188 -2.511719 6.03125 -1.871094 C 5.8125 -1.222656 5.492188 -0.726563 5.0625 -0.375 C 4.632813 -0.0234375 4.089844 0.152344 3.4375 0.152344 C 2.570313 0.152344 1.890625 -0.15625 1.402344 -0.773438 C 0.808594 -1.515625 0.515625 -2.726563 0.519531 -4.414063 Z M 1.648438 -4.414063 C 1.644531 -2.941406 1.816406 -1.964844 2.164063 -1.480469 C 2.503906 -0.992188 2.929688 -0.75 3.4375 -0.75 C 3.9375 -0.75 4.359375 -0.992188 4.707031 -1.480469 C 5.050781 -1.96875 5.226563 -2.945313 5.226563 -4.414063 C 5.226563 -5.882813 5.050781 -6.863281 4.707031 -7.347656 C 4.359375 -7.832031 3.933594 -8.074219 3.425781 -8.074219 C 2.917969 -8.074219 2.515625 -7.859375 2.214844 -7.433594 C 1.835938 -6.886719 1.644531 -5.878906 1.648438 -4.414063 Z M 1.648438 -4.414063 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-6\">\n <path style=\"stroke:none;\" d=\"M 1.164063 0 L 1.164063 -8.949219 L 2.351563 -8.949219 L 2.351563 0 Z M 1.164063 0 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-7\">\n <path style=\"stroke:none;\" d=\"M 0.824219 0 L 0.824219 -6.480469 L 1.8125 -6.480469 L 1.8125 -5.558594 C 2.285156 -6.269531 2.972656 -6.625 3.875 -6.628906 C 4.261719 -6.625 4.621094 -6.554688 4.953125 -6.417969 C 5.277344 -6.273438 5.523438 -6.089844 5.6875 -5.863281 C 5.847656 -5.632813 5.960938 -5.363281 6.03125 -5.054688 C 6.066406 -4.847656 6.085938 -4.492188 6.089844 -3.984375 L 6.089844 0 L 4.992188 0 L 4.992188 -3.941406 C 4.992188 -4.386719 4.949219 -4.722656 4.863281 -4.945313 C 4.777344 -5.167969 4.625 -5.34375 4.40625 -5.476563 C 4.1875 -5.605469 3.933594 -5.671875 3.644531 -5.675781 C 3.175781 -5.671875 2.769531 -5.523438 2.429688 -5.230469 C 2.089844 -4.929688 1.921875 -4.367188 1.921875 -3.539063 L 1.921875 0 Z M 0.824219 0 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-8\">\n <path style=\"stroke:none;\" d=\"M 5.03125 0 L 5.03125 -0.816406 C 4.617188 -0.171875 4.011719 0.144531 3.214844 0.148438 C 2.695313 0.144531 2.21875 0.0078125 1.789063 -0.277344 C 1.351563 -0.558594 1.015625 -0.957031 0.78125 -1.472656 C 0.539063 -1.980469 0.421875 -2.570313 0.425781 -3.234375 C 0.421875 -3.882813 0.53125 -4.46875 0.75 -4.996094 C 0.964844 -5.519531 1.285156 -5.921875 1.71875 -6.207031 C 2.148438 -6.484375 2.632813 -6.625 3.167969 -6.628906 C 3.554688 -6.625 3.902344 -6.542969 4.210938 -6.378906 C 4.511719 -6.210938 4.761719 -5.996094 4.957031 -5.738281 L 4.957031 -8.949219 L 6.046875 -8.949219 L 6.046875 0 Z M 1.554688 -3.234375 C 1.550781 -2.402344 1.726563 -1.78125 2.078125 -1.371094 C 2.425781 -0.960938 2.839844 -0.753906 3.320313 -0.757813 C 3.796875 -0.753906 4.203125 -0.949219 4.542969 -1.34375 C 4.875 -1.734375 5.042969 -2.335938 5.046875 -3.144531 C 5.042969 -4.027344 4.875 -4.675781 4.535156 -5.09375 C 4.191406 -5.507813 3.769531 -5.71875 3.273438 -5.71875 C 2.78125 -5.71875 2.371094 -5.519531 2.046875 -5.121094 C 1.714844 -4.722656 1.550781 -4.09375 1.554688 -3.234375 Z M 1.554688 -3.234375 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-9\">\n <path style=\"stroke:none;\" d=\"M 5.261719 -2.085938 L 6.398438 -1.945313 C 6.21875 -1.28125 5.886719 -0.765625 5.402344 -0.402344 C 4.917969 -0.0351563 4.296875 0.144531 3.546875 0.148438 C 2.59375 0.144531 1.84375 -0.144531 1.289063 -0.726563 C 0.734375 -1.3125 0.457031 -2.132813 0.457031 -3.1875 C 0.457031 -4.273438 0.734375 -5.117188 1.296875 -5.722656 C 1.855469 -6.324219 2.585938 -6.625 3.484375 -6.628906 C 4.347656 -6.625 5.054688 -6.332031 5.609375 -5.742188 C 6.15625 -5.152344 6.433594 -4.320313 6.433594 -3.253906 C 6.433594 -3.183594 6.429688 -3.085938 6.425781 -2.960938 L 1.59375 -2.960938 C 1.632813 -2.242188 1.832031 -1.699219 2.195313 -1.324219 C 2.558594 -0.945313 3.011719 -0.753906 3.550781 -0.757813 C 3.953125 -0.753906 4.296875 -0.859375 4.582031 -1.074219 C 4.867188 -1.28125 5.09375 -1.621094 5.261719 -2.085938 Z M 1.652344 -3.863281 L 5.273438 -3.863281 C 5.222656 -4.402344 5.082031 -4.8125 4.859375 -5.089844 C 4.503906 -5.511719 4.050781 -5.722656 3.496094 -5.726563 C 2.992188 -5.722656 2.570313 -5.554688 2.226563 -5.21875 C 1.882813 -4.878906 1.691406 -4.425781 1.652344 -3.863281 Z M 1.652344 -3.863281 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph0-10\">\n <path style=\"stroke:none;\" d=\"M 0.0898438 0 L 2.460938 -3.367188 L 0.269531 -6.480469 L 1.640625 -6.480469 L 2.636719 -4.960938 C 2.824219 -4.667969 2.972656 -4.425781 3.089844 -4.234375 C 3.261719 -4.503906 3.425781 -4.742188 3.582031 -4.949219 L 4.675781 -6.480469 L 5.988281 -6.480469 L 3.746094 -3.429688 L 6.160156 0 L 4.808594 0 L 3.480469 -2.015625 L 3.125 -2.558594 L 1.421875 0 Z M 0.0898438 0 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-0\">\n <path style=\"stroke:none;\" d=\"M -1.054688 -6.292969 L 0 -6.292969 L 0 -0.378906 C -0.265625 -0.367188 -0.519531 -0.410156 -0.761719 -0.507813 C -1.164063 -0.65625 -1.558594 -0.898438 -1.953125 -1.230469 C -2.339844 -1.558594 -2.792969 -2.035156 -3.308594 -2.667969 C -4.101563 -3.636719 -4.734375 -4.292969 -5.203125 -4.636719 C -5.667969 -4.976563 -6.105469 -5.148438 -6.523438 -5.152344 C -6.957031 -5.148438 -7.324219 -4.992188 -7.625 -4.683594 C -7.921875 -4.371094 -8.074219 -3.96875 -8.074219 -3.46875 C -8.074219 -2.9375 -7.914063 -2.511719 -7.597656 -2.195313 C -7.277344 -1.878906 -6.839844 -1.71875 -6.28125 -1.714844 L -6.398438 -0.585938 C -7.238281 -0.664063 -7.878906 -0.953125 -8.320313 -1.457031 C -8.761719 -1.960938 -8.980469 -2.640625 -8.984375 -3.492188 C -8.980469 -4.347656 -8.742188 -5.023438 -8.269531 -5.527344 C -7.789063 -6.027344 -7.199219 -6.28125 -6.5 -6.28125 C -6.140625 -6.28125 -5.789063 -6.207031 -5.445313 -6.058594 C -5.09375 -5.910156 -4.730469 -5.664063 -4.351563 -5.328125 C -3.964844 -4.984375 -3.441406 -4.421875 -2.777344 -3.636719 C -2.222656 -2.976563 -1.84375 -2.554688 -1.648438 -2.367188 C -1.449219 -2.179688 -1.253906 -2.023438 -1.054688 -1.90625 Z M -1.054688 -6.292969 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-1\">\n <path style=\"stroke:none;\" d=\"M 0 -4.039063 L -2.140625 -4.039063 L -2.140625 -0.160156 L -3.148438 -0.160156 L -8.949219 -4.242188 L -8.949219 -5.140625 L -3.148438 -5.140625 L -3.148438 -6.347656 L -2.140625 -6.347656 L -2.140625 -5.140625 L 0 -5.140625 Z M -3.148438 -4.039063 L -7.183594 -4.039063 L -3.148438 -1.238281 Z M -3.148438 -4.039063 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-2\">\n <path style=\"stroke:none;\" d=\"M -6.757813 -6.21875 L -6.671875 -5.125 C -7.097656 -5.027344 -7.410156 -4.890625 -7.609375 -4.710938 C -7.921875 -4.414063 -8.078125 -4.046875 -8.082031 -3.613281 C -8.078125 -3.261719 -7.980469 -2.953125 -7.789063 -2.691406 C -7.53125 -2.339844 -7.164063 -2.066406 -6.683594 -1.871094 C -6.195313 -1.667969 -5.503906 -1.566406 -4.613281 -1.5625 C -5.011719 -1.824219 -5.3125 -2.148438 -5.511719 -2.53125 C -5.703125 -2.914063 -5.800781 -3.3125 -5.804688 -3.734375 C -5.800781 -4.464844 -5.53125 -5.089844 -4.996094 -5.605469 C -4.453125 -6.117188 -3.757813 -6.375 -2.90625 -6.378906 C -2.34375 -6.375 -1.820313 -6.253906 -1.339844 -6.015625 C -0.855469 -5.769531 -0.484375 -5.4375 -0.230469 -5.015625 C 0.0273438 -4.59375 0.152344 -4.113281 0.152344 -3.578125 C 0.152344 -2.660156 -0.183594 -1.914063 -0.855469 -1.335938 C -1.527344 -0.757813 -2.636719 -0.46875 -4.1875 -0.46875 C -5.914063 -0.46875 -7.171875 -0.789063 -7.960938 -1.429688 C -8.640625 -1.984375 -8.980469 -2.734375 -8.984375 -3.679688 C -8.980469 -4.382813 -8.785156 -4.957031 -8.390625 -5.410156 C -7.996094 -5.855469 -7.449219 -6.125 -6.757813 -6.21875 Z M -2.898438 -1.734375 C -2.519531 -1.734375 -2.15625 -1.8125 -1.8125 -1.972656 C -1.460938 -2.132813 -1.199219 -2.359375 -1.019531 -2.648438 C -0.839844 -2.9375 -0.75 -3.238281 -0.75 -3.558594 C -0.75 -4.019531 -0.9375 -4.417969 -1.3125 -4.753906 C -1.6875 -5.082031 -2.195313 -5.25 -2.839844 -5.253906 C -3.453125 -5.25 -3.941406 -5.085938 -4.300781 -4.757813 C -4.65625 -4.429688 -4.832031 -4.015625 -4.835938 -3.515625 C -4.832031 -3.015625 -4.65625 -2.59375 -4.300781 -2.25 C -3.941406 -1.90625 -3.472656 -1.734375 -2.898438 -1.734375 Z M -2.898438 -1.734375 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-3\">\n <path style=\"stroke:none;\" d=\"M -4.851563 -2.210938 C -5.015625 -1.75 -5.253906 -1.414063 -5.566406 -1.195313 C -5.875 -0.976563 -6.242188 -0.867188 -6.675781 -0.867188 C -7.324219 -0.867188 -7.871094 -1.097656 -8.316406 -1.566406 C -8.757813 -2.03125 -8.980469 -2.65625 -8.984375 -3.4375 C -8.980469 -4.214844 -8.753906 -4.84375 -8.304688 -5.320313 C -7.847656 -5.796875 -7.296875 -6.035156 -6.648438 -6.035156 C -6.230469 -6.035156 -5.867188 -5.925781 -5.5625 -5.707031 C -5.25 -5.488281 -5.015625 -5.15625 -4.851563 -4.71875 C -4.671875 -5.265625 -4.382813 -5.683594 -3.984375 -5.972656 C -3.585938 -6.253906 -3.109375 -6.398438 -2.558594 -6.402344 C -1.789063 -6.398438 -1.144531 -6.128906 -0.628906 -5.589844 C -0.105469 -5.046875 0.152344 -4.332031 0.152344 -3.453125 C 0.152344 -2.566406 -0.105469 -1.855469 -0.628906 -1.316406 C -1.148438 -0.773438 -1.800781 -0.503906 -2.585938 -0.507813 C -3.164063 -0.503906 -3.652344 -0.652344 -4.050781 -0.949219 C -4.441406 -1.242188 -4.710938 -1.660156 -4.851563 -2.210938 Z M -6.714844 -1.988281 C -6.289063 -1.984375 -5.941406 -2.121094 -5.675781 -2.398438 C -5.40625 -2.667969 -5.273438 -3.023438 -5.273438 -3.460938 C -5.273438 -3.878906 -5.40625 -4.226563 -5.671875 -4.5 C -5.9375 -4.769531 -6.261719 -4.902344 -6.652344 -4.90625 C -7.050781 -4.902344 -7.390625 -4.765625 -7.667969 -4.488281 C -7.941406 -4.207031 -8.078125 -3.859375 -8.082031 -3.449219 C -8.078125 -3.027344 -7.945313 -2.679688 -7.675781 -2.402344 C -7.40625 -2.125 -7.085938 -1.984375 -6.714844 -1.988281 Z M -2.582031 -1.636719 C -2.265625 -1.632813 -1.960938 -1.707031 -1.671875 -1.859375 C -1.375 -2.003906 -1.148438 -2.226563 -0.992188 -2.519531 C -0.828125 -2.8125 -0.75 -3.128906 -0.75 -3.46875 C -0.75 -3.992188 -0.917969 -4.421875 -1.257813 -4.765625 C -1.59375 -5.105469 -2.023438 -5.277344 -2.546875 -5.28125 C -3.074219 -5.277344 -3.511719 -5.101563 -3.855469 -4.75 C -4.199219 -4.394531 -4.371094 -3.953125 -4.375 -3.429688 C -4.371094 -2.910156 -4.199219 -2.484375 -3.863281 -2.144531 C -3.519531 -1.804688 -3.09375 -1.632813 -2.582031 -1.636719 Z M -2.582031 -1.636719 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-4\">\n <path style=\"stroke:none;\" d=\"M 0 -4.65625 L 0 -3.558594 L -7 -3.558594 C -6.746094 -3.289063 -6.492188 -2.941406 -6.242188 -2.515625 C -5.988281 -2.085938 -5.800781 -1.703125 -5.675781 -1.359375 L -6.738281 -1.359375 C -7.027344 -1.972656 -7.375 -2.507813 -7.789063 -2.972656 C -8.195313 -3.429688 -8.59375 -3.757813 -8.984375 -3.949219 L -8.984375 -4.65625 Z M 0 -4.65625 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-5\">\n <path style=\"stroke:none;\" d=\"M -4.414063 -0.519531 C -5.46875 -0.515625 -6.320313 -0.625 -6.964844 -0.84375 C -7.609375 -1.0625 -8.105469 -1.386719 -8.457031 -1.816406 C -8.804688 -2.246094 -8.980469 -2.785156 -8.984375 -3.4375 C -8.980469 -3.914063 -8.886719 -4.335938 -8.695313 -4.699219 C -8.5 -5.058594 -8.21875 -5.355469 -7.859375 -5.59375 C -7.492188 -5.828125 -7.050781 -6.015625 -6.527344 -6.152344 C -6.003906 -6.285156 -5.296875 -6.351563 -4.414063 -6.355469 C -3.359375 -6.351563 -2.511719 -6.242188 -1.871094 -6.03125 C -1.222656 -5.8125 -0.726563 -5.492188 -0.375 -5.0625 C -0.0234375 -4.632813 0.152344 -4.089844 0.152344 -3.4375 C 0.152344 -2.570313 -0.15625 -1.890625 -0.773438 -1.402344 C -1.515625 -0.808594 -2.726563 -0.515625 -4.414063 -0.519531 Z M -4.414063 -1.648438 C -2.941406 -1.644531 -1.964844 -1.816406 -1.480469 -2.164063 C -0.992188 -2.503906 -0.75 -2.929688 -0.75 -3.4375 C -0.75 -3.9375 -0.992188 -4.359375 -1.480469 -4.707031 C -1.96875 -5.050781 -2.945313 -5.226563 -4.414063 -5.226563 C -5.882813 -5.226563 -6.863281 -5.050781 -7.347656 -4.707031 C -7.832031 -4.359375 -8.074219 -3.933594 -8.074219 -3.425781 C -8.074219 -2.917969 -7.859375 -2.515625 -7.433594 -2.214844 C -6.886719 -1.835938 -5.878906 -1.644531 -4.414063 -1.648438 Z M -4.414063 -1.648438 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph1-6\">\n <path style=\"stroke:none;\" d=\"M -5.230469 -1.128906 L -6.480469 -1.128906 L -6.480469 -2.378906 L -5.230469 -2.378906 Z M 0 -1.128906 L -1.25 -1.128906 L -1.25 -2.378906 L 0 -2.378906 Z M 0 -1.128906 \"/>\n </symbol>\n <symbol overflow=\"visible\" id=\"glyph2-0\">\n <path style=\"stroke:none;\" d=\"M 0.621094 -6.824219 L 5.046875 -6.632813 L 5 -3.128906 L 5.152344 -3.128906 L 5.488281 -2.757813 L 5.878906 -2.734375 L 5.949219 -2.90625 L 6.214844 -2.632813 L 6.226563 -2.472656 L 6.925781 -2.285156 L 7.121094 -2.335938 L 7.273438 -2.171875 L 7.5 -2.300781 L 7.875 -2.300781 L 7.898438 -2.074219 L 8.097656 -2.039063 L 8.148438 -1.800781 L 8.277344 -1.800781 L 8.585938 -2.039063 L 8.898438 -1.714844 L 9.234375 -1.863281 L 9.351563 -1.527344 L 9.449219 -1.800781 L 9.675781 -1.964844 L 9.9375 -1.777344 L 10.175781 -1.863281 L 10.1875 -1.777344 L 10.589844 -1.515625 L 10.675781 -1.609375 L 11.175781 -1.863281 L 11.425781 -1.824219 L 11.6875 -2.011719 L 11.851563 -1.847656 L 12.0625 -1.847656 L 12.273438 -2.039063 L 12.652344 -1.847656 L 12.824219 -1.671875 L 13.429688 -1.488281 L 13.371094 -4.648438 L 13.050781 -6.714844 L 13.023438 -7.636719 L 6.871094 -7.550781 L 0.675781 -7.738281 Z M 0.621094 -6.824219 \"/>\n </symbol>\n </g>\n <clipPath id=\"clip1\">\n <path d=\"M 59.039063 59.039063 L 402.757813 59.039063 L 402.757813 359.558594 L 59.039063 359.558594 Z M 59.039063 59.039063 \"/>\n </clipPath>\n </defs>\n <g id=\"surface36\">\n <rect x=\"0\" y=\"0\" width=\"432\" height=\"432\" style=\"fill: rgb(100%,100%,100%); fill-opacity: 1; stroke: none;\"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 106.992188 358.558594 L 389.066406 358.558594 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 106.992188 358.558594 L 106.992188 365.761719 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 177.511719 358.558594 L 177.511719 365.761719 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 248.03125 358.558594 L 248.03125 365.761719 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 318.546875 358.558594 L 318.546875 365.761719 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 389.066406 358.558594 L 389.066406 365.761719 \"/>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph0-0\" x=\"103.515625\" y=\"385.921875\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph0-1\" x=\"174.035156\" y=\"385.921875\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph0-2\" x=\"244.554688\" y=\"385.921875\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph0-3\" x=\"315.070313\" y=\"385.921875\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph0-4\" x=\"382.113281\" y=\"385.921875\"/>\n <use xlink:href=\"#glyph0-5\" x=\"389.065186\" y=\"385.921875\"/>\n </g>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 316.652344 L 59.039063 70.132813 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 316.652344 L 51.839844 316.652344 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 255.023438 L 51.839844 255.023438 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 193.394531 L 51.839844 193.394531 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 131.761719 L 51.839844 131.761719 \"/>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 70.132813 L 51.839844 70.132813 \"/>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph1-0\" x=\"43.199219\" y=\"320.128906\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph1-1\" x=\"43.199219\" y=\"258.5\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph1-2\" x=\"43.199219\" y=\"196.871094\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph1-3\" x=\"43.199219\" y=\"135.238281\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph1-4\" x=\"43.199219\" y=\"77.085938\"/>\n <use xlink:href=\"#glyph1-5\" x=\"43.199219\" y=\"70.134033\"/>\n </g>\n <path style=\"fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;\" d=\"M 59.039063 358.558594 L 401.761719 358.558594 L 401.761719 59.039063 L 59.039063 59.039063 L 59.039063 358.558594 \"/>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph0-6\" x=\"215.109375\" y=\"414.71875\"/>\n <use xlink:href=\"#glyph0-7\" x=\"218.582275\" y=\"414.71875\"/>\n <use xlink:href=\"#glyph0-8\" x=\"225.53418\" y=\"414.71875\"/>\n <use xlink:href=\"#glyph0-9\" x=\"232.486084\" y=\"414.71875\"/>\n <use xlink:href=\"#glyph0-10\" x=\"239.437988\" y=\"414.71875\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph1-4\" x=\"14.398438\" y=\"220.964844\"/>\n <use xlink:href=\"#glyph1-6\" x=\"14.398438\" y=\"214.012939\"/>\n <use xlink:href=\"#glyph1-4\" x=\"14.398438\" y=\"210.540039\"/>\n <use xlink:href=\"#glyph1-5\" x=\"14.398438\" y=\"203.588135\"/>\n </g>\n <g clip-path=\"url(#clip1)\" clip-rule=\"nonzero\">\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"64.710938\" y=\"352.082031\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"99.96875\" y=\"321.265625\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"135.226563\" y=\"290.453125\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"170.488281\" y=\"259.636719\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"205.746094\" y=\"228.820313\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"241.007813\" y=\"198.007813\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"276.265625\" y=\"167.191406\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"311.523438\" y=\"136.378906\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"346.785156\" y=\"105.5625\"/>\n </g>\n <g style=\"fill:rgb(0%,0%,0%);fill-opacity:1;\">\n <use xlink:href=\"#glyph2-0\" x=\"382.042969\" y=\"74.746094\"/>\n </g>\n </g>\n </g>\n</svg>\n","config":{"controlIconsEnabled":true}},"evals":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-438">{"viewer":{"width":500,"height":500,"padding":15,"fill":false},"browser":{"width":500,"height":500,"padding":40,"fill":false}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment