// Code generated by go-bindata. // sources: // ../origin-web-console/dist/404.html // ../origin-web-console/dist/images/apple-touch-icon-precomposed.png // ../origin-web-console/dist/images/console-sprite.png // ../origin-web-console/dist/images/favicon.ico // ../origin-web-console/dist/images/favicon.png // ../origin-web-console/dist/images/logo-origin-thin.svg // ../origin-web-console/dist/images/logo-origin.png // ../origin-web-console/dist/images/logo-origin.svg // ../origin-web-console/dist/images/mstile-144x144.png // ../origin-web-console/dist/images/openshift-logo.svg // ../origin-web-console/dist/images/openshift-logo222.png // ../origin-web-console/dist/images/redhat.png // ../origin-web-console/dist/images/redhat.svg // ../origin-web-console/dist/images/sprite-vert.png // ../origin-web-console/dist/index.html // ../origin-web-console/dist/robots.txt // ../origin-web-console/dist/scripts/oldieshim.js // ../origin-web-console/dist/scripts/scripts.js // ../origin-web-console/dist/scripts/templates.js // ../origin-web-console/dist/scripts/vendor.js // ../origin-web-console/dist/styles/fonts/FontAwesome.otf // ../origin-web-console/dist/styles/fonts/OpenSans-Bold-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-Bold-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-Bold-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-Bold-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-BoldItalic-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-BoldItalic-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-BoldItalic-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-BoldItalic-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBold-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBold-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBold-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBold-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBoldItalic-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBoldItalic-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBoldItalic-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-ExtraBoldItalic-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-Italic-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-Italic-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-Italic-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-Italic-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-Light-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-Light-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-Light-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-Light-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-LightItalic-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-LightItalic-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-LightItalic-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-LightItalic-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-Regular-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-Regular-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-Regular-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-Regular-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-Semibold-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-Semibold-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-Semibold-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-Semibold-webfont.woff // ../origin-web-console/dist/styles/fonts/OpenSans-SemiboldItalic-webfont.eot // ../origin-web-console/dist/styles/fonts/OpenSans-SemiboldItalic-webfont.svg // ../origin-web-console/dist/styles/fonts/OpenSans-SemiboldItalic-webfont.ttf // ../origin-web-console/dist/styles/fonts/OpenSans-SemiboldItalic-webfont.woff // ../origin-web-console/dist/styles/fonts/PatternFlyIcons-webfont.eot // ../origin-web-console/dist/styles/fonts/PatternFlyIcons-webfont.svg // ../origin-web-console/dist/styles/fonts/PatternFlyIcons-webfont.ttf // ../origin-web-console/dist/styles/fonts/PatternFlyIcons-webfont.woff // ../origin-web-console/dist/styles/fonts/fontawesome-webfont.eot // ../origin-web-console/dist/styles/fonts/fontawesome-webfont.svg // ../origin-web-console/dist/styles/fonts/fontawesome-webfont.ttf // ../origin-web-console/dist/styles/fonts/fontawesome-webfont.woff // ../origin-web-console/dist/styles/fonts/fontawesome-webfont.woff2 // ../origin-web-console/dist/styles/fonts/glyphicons-halflings-regular.eot // ../origin-web-console/dist/styles/fonts/glyphicons-halflings-regular.svg // ../origin-web-console/dist/styles/fonts/glyphicons-halflings-regular.ttf // ../origin-web-console/dist/styles/fonts/glyphicons-halflings-regular.woff // ../origin-web-console/dist/styles/fonts/glyphicons-halflings-regular.woff2 // ../origin-web-console/dist/styles/fonts/openshift-icon.dev.svg // ../origin-web-console/dist/styles/fonts/openshift-icon.eot // ../origin-web-console/dist/styles/fonts/openshift-icon.json // ../origin-web-console/dist/styles/fonts/openshift-icon.svg // ../origin-web-console/dist/styles/fonts/openshift-icon.ttf // ../origin-web-console/dist/styles/fonts/openshift-icon.woff // ../origin-web-console/dist/styles/fonts/openshift-logos-icon.eot // ../origin-web-console/dist/styles/fonts/openshift-logos-icon.json // ../origin-web-console/dist/styles/fonts/openshift-logos-icon.svg // ../origin-web-console/dist/styles/fonts/openshift-logos-icon.ttf // ../origin-web-console/dist/styles/fonts/openshift-logos-icon.woff // ../origin-web-console/dist/styles/main.css // ../origin-web-console/dist/styles/vendor.css // DO NOT EDIT! package assets import ( "fmt" "strings" "os" "time" "io/ioutil" "path/filepath" ) type asset struct { bytes []byte info os.FileInfo } type bindataFileInfo struct { name string size int64 mode os.FileMode modTime time.Time } func (fi bindataFileInfo) Name() string { return fi.name } func (fi bindataFileInfo) Size() int64 { return fi.size } func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } func (fi bindataFileInfo) IsDir() bool { return false } func (fi bindataFileInfo) Sys() interface{} { return nil } var __404Html = []byte(` Page Not Found :(

Not found :(

Sorry, but the page you were trying to view does not exist.

It looks like this was the result of either:

`) func _404HtmlBytes() ([]byte, error) { return __404Html, nil } func _404Html() (*asset, error) { bytes, err := _404HtmlBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "404.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesAppleTouchIconPrecomposedPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x90\x00\x00\x00\x90\b\x06\x00\x00\x00\xe7F\xe2\xb8\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x00\tpHYs\x00\x00\r\xd7\x00\x00\r\xd7\x01B(\x9bx\x00\x00\x00\atIME\a\xdd\x06\x13\x14\x17$\x8d7\xc3k\x00\x00\x17IIDATx\xda\xed\x9dy\x94\\W}\xe7?\xf7\xed\xef\xd5\u05ab\xba\xb5aY\x96\x8d-\xd9\x06\x1b[,F\u0610\x18\x88\xc3\x009I\x88I\x02g\x98\u00dc\x81L\x18\x92\xf1a\x98\x19\xc7c \x81\x048s\u019e\xf9#\xc9@HB\x12s\xc61\xcc\xc4'd<$\xd8\xd8\xc1\x1b\xde\x12\x8c7\u0656\xb5vK\xad\xee\xea\xee\xda^\xbd\xed\xde\xf9\xa3\xaaEkkI\u076f\xba\xabJ\xef{\x8e\xf4\x87N\xa9\xea\xbe\xfb>\xf7w\u007f\xf7w\u007f\xf7w\x05\xa0\u0214i\x99\u04b2.\u0214\x01\x94)\x03(S\x06P\xa6\f\xa0L\x992\x802e\x00e\xca\x00\u0294\x01\x94)S\x06P\xa6\f\xa0L\x19@\x992\x802e\xca\x00\u0294\x01\x94)\x03(S\x06P\xa6L\x19@\x99V,\xe3|~x\xd1\x1eA\x96\xd0\xc8i\x1a\x9e\u0430\x84\xc0\x16\u06b1\x91\xe5i\x1a\x06\x82\x04E]J$\x10)ESI\x1aJR\x97\x92P\xb5\xfe]e\x00\xf5?0\u00da\xc1\xb8a\xb2\u0574\xb9\xccr\xb9\u0434)h:\u00fa\xc1\xb0nP\xd0t\f!\xce\b\xc3l\x123\x9b\xc4\xcc$1\x15\x99\xf0j\x1c\xf0\\\xe0\xb37\n\x98\x8cC\xe6dr^\x00%\xfay\xe0\b\xc0\x15\x1ac\x86\xc9\x1bm\x8f]n\x81\xcb-\x97\v-\xa7c\xbf\xa9\x94bO\x14\xf0l\xd0\xe0\xd1f\x8d\xa7\x9bu\x0e'\x11M\xa52\x80zE\x9e\xd0\xd8b\xda\xecr\xf3\\\xeb\xe4\xb9\xca\xf6(\xe9\u019a=0\xd6\xd1\xe0_7\xebG~\x8d;\xe7\x0e\xf3\xa3f=\x03\xe8\\d\t\xc1'J\xeb\xf8\x8d\x811\xf4.\x89\u5b15\u6498/\x97'\xf8Nm\x16\x99\x01tf\x954\x9d[\x06\xc7\xf9\xd5\xc20\xea<\x87gA\xa1\x94\xdc1w\x84?\x9d\x9f\"\xce\x00:\xbdF5\x83\u03cdl\xe4=^)\x83\xe7\x04EJ\xf1\x17\x95\xa3\xdc1{\x04_u\x87-\u0481\xcfu\r<\xba\xc1\x17F6\xb5\x9c\xe5\f\x9e\x93_\x96\x10\\e{\xe4u\x9d'\xbad+\xa4k,\xd0\x16\xc3\xe2\x8b#\x9by\xb3\x9b\xcfj\xee\x9dAJ)\uea55\xf9ry\x92\xf95\xde\x06\xe9\x8a\xd8\u007fQ\xd3\xf8\xc2\xc8&v:\xb9\f\x9e\xb3\x19\xf5B\xf0K\xf9!~kp\x1c\x8b\xb5\xb5\xd4k\x1e\x91\xb3\x10|~x\x13os\vk\x0e\x8f\x00B\xa5h\u0204\x86\x92\xc4J\x1dk\x93\x8e\xc0\x12\xad?\xae\u04304m\xcd!\xba\xb90\xccD\x1c\xf2\xb5\xf9\xa3\xe7'@:p\xcb\xd087\xe5\x06V\x1d\x9e\x85q[\x97\t/\x85M\x9e\x0f[\u0644e\x193\x13\xc7\xcc\u0218\xa6T\xc7&yM\xb4\xd2E\n\x9aNI\xd7\x19\xd7M\xb6\x9a\x0eW\xd8.\xdbL\aG\xd3V\xfd\x19\f!\xf8\xed\x81qfe\xcc=\xd5\xd9%?;\xa8\x19\xe8B0\x9dD\xfd\x03\xd0\a\xf3C\xdc\\\x18F?\x8b\x14\u04b4\x14+\u015c\x8cy\xbaY\xe7\xfb\x8d\n\x8f7\xebTeL\xad\x9d\xef|\xae\x03 \xd7N\x87\xbd\xc6\xceq\x83W\xe0\x1a'OI\xd3W-vej\x1a\x9f\x19\xdc\xc0+a\xc0?\x05\x8d\xe3\x06\x88\x81\xe0\x12\xcb\xe3\xba\xdc\x10\xd7\xe5\x86\t\x10\xfc\x97\xc3\xcfs8\x0ez\u07c9\xde\xe9\xe4\xb8s\xf4\x02F\rsU\x1a\xa0\x94\xe2!\xbf\xca\xdf\xd5\xe7\xf8Q\xb3\xced\x1c\x92\xb6\xfbi\"\xd8hX\xbc\xc5\xcd\xf1no\x80wx\xab7-?\u04ec\xf3\x9bS{\x99Jb\xaer\nl\xb3\xf3\xec\xf4\x06\xd9d\xe5p4\x13\xd9~\xd9\xf7W\x8f\xf0G\xd3{\x88Sj\u065a\x004\xae\x9b\xfc\xe1\xd8\x16.\xb7\xbdU\xf9\xbd\a\xfd\n_\x9e\x99d_\x1c\x10\xaeRn\xb2-\x04\x97X\x0e\x9f\x1f\xde\u0115\xb6\u05f1N^\xb0sQ\"\xf9~\xd0 \xd1=\u0599\x1e\x86\xd0N\x99\x8d\xa9\x94\xe2\xabS/\xf2xc\xb67\x01\xb2\x85\xe0?\f\xae\u78e5\u044e\xfex\xa2\x14/\x86>_\x9b?\xcaw\xebsk\xea\xf0\xde\\\x18\xe2\xe3\xa5u\\`\u06a9\xbd4\xa9\x14\x81R\xf8h\x1cJ$\r\xcd\xc6\xd1-\xd4\"\xa8N\xfc?\x06\x12[)~\xec\xcf\xf2;S/\x13\xa40\x98V\x1d\xa0]n\x81\xaf\x8elf\xd80;\xf6\x1b3I\xc47\u69f9\xbb:\xc3\\\x97\xa4\x8b\x8e\xe9\x06\x1f+\x8ersq\x98\xbc\xa6\x9fs\xa7\v\xa5\x90@\x88\xa2\xae\x04e\xa5Q\xc5D\t\x03]\x00B\x1c\x03G\xb5\xff\xd6\x11\x18(,%\xb1\x91\xe8\xa8\xd6\vW\x8a\u06cf\xbe\xc6\xfd\x8dro\x01T\xd2t\xee\x18}\x1d\xbb\xbcbG~T*\xc5S\xcd:_*O\xf0\x93.M\xc8z\xa7[\xe4?\x0f\xadg\xcb\xd9f\x17(\x85DQS\x1ae%h\b\x93\x9a\u04b0t\x03\xd1\x06\x82E/QCa\x00\x16\x12KI\xac\xf6gN\\ \xbc\x18\xd4\xf8\xd4\xe1\xdd4W\xb8%\xb2\xaa[\x19\xbf^\x18\xe1\xc3\xc5\xe1\x8elS(\xa5\xf8fe\x9a\xcf\xcd\x1cb\u007f\x1c\u04ad\xda\x1b\a\xfc\u042f1f\x18l;\x03D{\xc2&\u07ed\xcf!\x8d\x02U\u0363.L\x12\xa1cj?=9\xabhE\x83M$\x8eJ\xc8#\xf1H\xb0\xda \xa9\xd3X\x88\x11\xc3bo\xe4\xb3'Z\xd9@[\xb5e\xfc\x16\xc3\xe2\u05ca\xc3h\x1dX\xb2\xc7J\xf2\xfb3\x13|\xb3:C/\xe8\xb58\u0de7\xf6s\xdbp\u0087\x8b\xc3'\xf5\u01d3~\x8d{je\x1e\xf6k\x1cN\"^_\xafp\xeb\u0625\xe4t\xeb\xa7\x03\xa6\xfd\xf2\\\x95`\"1\x16Y#N\xb0J\xa7\u0491\x94\x06\u066a\x01\xf4K\x85!6\x1aV\xea\xf0\xd4d\xc2W\xca\x13|\xabZ\xa6\x97\x14\xa2\xb8m\xe6 5\x99psq\x98\x83q\u0213\xcd:\u07e9\x96y!l\x1e\xb7\xcc~)\xa8\xf1\x17\xe5\xfd||x+\x96\xa6\xb5\xac\r\x12[\u0253\xa6\xb0\xa5\xe2_\xe5$\xe2\xb5\xd0\xe7\xbe\xfa\f\x8f\xfb\xf3TS\xf0\x0fW\xc5\a\xba\xd8t\xf8\xfa\u0605l0\xadT\x97\xafM)\xf9\xdd\xf2!\xfeW\x8f\xc1s\xe2\b\xbe\xd2\xf6\xd8\x13\x05K:\xfc:\xf0\xa1\xd2\x06>1\xb8\t\xed\x1cB\x9e\r)y\u049f\xe7\xa1\xc6,\xcf\au&\xe2\x904O\xed\xaf\x8a\x05\xfa\x85\xfc \x1b\xcdt\xadOSJ~\xbf<\xd1\xd3\xf0\x00\xc4\xc0\u04cb\"\u0227\rK\x00w\xcfOp\x91i\xf3\x9e\xfc\xf0\x92\xbe`CI\xa6\x92\x90\xfbj3<\u0498co\xd4\xec\xe8\x00\xe8\xb8\xf5\xf9@~0m\x8f\x99o\xd7\xca\xfcU\x8f\xf8<\xa9\u0176\x80o\xccMp\x85\x9dc\x83\xe9\x9cd\x91\x0f\xc7\x01\x0f\xd4gy\xb81\xc7O\x82zj\xd1\xe65\x03H\x03\xde\xe9\x15\x18K1\xe6#\xda#\xf6\xf6\x99C\x9c\x8f\x9a\x88\x03\xbe>7\xc1\xed\xa3[\x91JQ\x97\t\xafD>\u007f27\xc1\ue80e\xaf\xe4\xaa\x06\xf6:\nPQ\u04f9\xc1-\x9d\x95\x93w\xb6:\x10\x85|jj/\xe7\xab4`wP\u3d70\x82B\xf1{\u04c7\xd8\x1d6\u05ac=\x1d\x05h\xbb\xe5r\xa9\xe5\xa4\x02\x8f\x00\x02)\xf9\x83\xf2\x04Gz\xf0\f\xf9J5\xa0i\\dZ\xdc\xe0\xe6\xb8\xde\xcbq\x99)\x99\x88C\xa4\x8a\u05b4]\x1d\x05h\x97[\xa0\xa0\xeb\xa9M]?\xf0+\xfc\xbf\xc6\xfcy\x03\x8d+\x04\xeb\r\x83]\x8e\xc7M\xb9<;\x1d\x8f\xfc\xa2\xbc#W\xb3y\x8fW\xe0\x95\xf9r\xff\x014\xaa\x1b\u0718+\xa5\xf6}sI\xccW\u0293}\x0f\x8d\tl0L\xaeu\x1c\xde\xe5\xe6\xb8\xcav\xb9\xc84\x8fE\xef\x17[s[h\xfc\\.\xc7\u0775y\x8e&I\u007f\x01\xb4\xddr\xd9b\u06a9M_\u07ec\u03b0\xaf\x8b\xb7(V\xaa\x92\xa6q\x85e\xf3\xbe\\\x91\xeb\\\x97-\x86\x89%\x04b\x89m\x1f\x05\\n9\xbc\xd5q\xb9\xb7^\xeb\x1f\x80L\x04\x1fLq\xe9>\x19\x87|\xbb\xc7\xe3='J\a\n\x9a\xc6%\xa6\xc5\xdb\\\x8fkl\x97\xb78.%\xfd\xdcv\xeas\x9a\u01bb\xdc\x1c\xf7\xd5\xeb\x84k\x90\x1b\xd8\x11\x80r\x9a\u019b\x9c\\j\xab\x8eG\xfd\x1a\x93}d}l!\xf8H\xa1\u010d^\x9e\xcb,\x8bQ\xdd8\x96\x02\xbb\x1c\x04\xde\xeezl6\r^\x8dV\u07e1\xee\xc8\u0442+\xda\xf5\t\xd3\x18\x0fJ)\xfe\xbaZ&\xe9#\xeb\xa3\x14\\m;\xbc\xcb\xcb1n\x98+\u029fVm\u007f\xf3\xca5*>\xd1\x11\x80^o9\xe4S(7'\x80\xa7\x82\xc6q\xc9\xe2\xfd\xa0\x10\u015fU\xe6\xa9\xcbt\x8e'\xbbB\xf0N/\xd7\x1f\x00\xe9\xc0f\xc3Z\xd2\xf9;\x17}\xbbZ\ueaf2\xb8\v\xfaQ\xe0\xf3L\xd0L\xe7\x05\b\xc1v\xcbfH\xd3{\x1f\xa0\xa2\xa6s\x99\xe5\xa6\xf2\xca\u7498\u007f\xee3\xeb\xb3X\x9f\x9d>\x92\xda\xd0\xd8b\x98\\i\u06fd\x0f\x90\xa7il2\xd2I\xdbx.\xf4\xd9\x13\x05}\v\xd0\xee(\xe4\xa1F:\x85\xa3\x06t\x9d\xedk\xe0\a\xa5\x0ePI3\xf0R8\xf6\xab\x94\xe2\x95\x13\x12\xab\xfaQw\xd7*\xa9\x9cnW\xc0\x0e\xcb\xc6Y\xe5\xaa&\xa9\x03\xb4\u0174\xb0Rx\x88\b\xc5\xf3\xa1\xdf\xf7\xc5\x16\x9e\x0e\x9a\xa9\xd5@\xdcnY\f\xac\xb2\x1f\x94:@\x9b\fk\xc5\x05\xbf\x05\xad\x14\xcc\x03\xa7\x89\xfd\xe44\x9d1\xc3\xea\x8b\xcb\xce\xf6F\x11G\x93$\x95g\xd9h\x98\f\xacr\u0447T\x03\x89\x02\x18\u048cT\xea\xf8\xf9R\x1e\xab}\xa3\x01\xb6\xd0\xd9\xe1\x14\xb8\xdc)\xb2\xc3-\xf1ZP\xe3\xeb\u5f6bv\u04b4S\x8aP\xfc\xa0Q\xe72ke\x0e\xb0\xa2\x15\xc0\xddh\x98\xbc\x18\x9d>\xe8j\v\x01\b\x82\x94*\x9c\xa5\x0ePA\xd3\xd1`E\x10)`:\x89(\xc7\x11orK\xecp\x8alw\x8al2s\xd8\xed\xfb\xbc&\xa3f\xdf\\\x13\xf3H\xd3\xe7\x93)\xa4\xa7\xdbB\xb0\xd90N\xf9MC\x9a\xce\xd5N\x91w\xe4\x06\xd9\x1d\xfa\xfc\xe5\xfcdw\x02\xe4i\u068a\xe0\x11-\x0f\x9aH3\xf9\x8f\xe3\xdb\xd9`z\x98B;.\xae\x94(E\xa8\xfa\xe7B\xb7}qD\xa4\xe4Y]t\xb7\x94$\xad\x8bg\x16\x03\xe4\n\x8d\xdf\x18\xdc\xc8\x1b\xdc\x12\xeb\f\vMh\xf8*\xbdT\xe0\xd4\xf7\xc2,!\xce\xc9\x02-\x9c\xf3\x8e\x14T\x10\u0336\x8f\xec\x1a\xa6\u0256E\u0769\x16}^G\xa1\xfa\xe8F\xc0\xc98\xe2P\x1cq\xc1\nO\xadh@Q\x17\xac7,\xb6\xdby~6?\xc8\x1b\x9c\"\xba\u040f\xeb?\u056d\xa72Z/\xf7\xecF\x91\x0e\x04*\xa1\xa1t&\x95FSX(\xa1\xa3i\xa2\xdd(u\xdc\xc82P\xd8H\\%\x11J\"T\x92jG\xac\xa5f\xa5d:I\xb8\xc0\\\xfeK\xacJ\x89\xaft\xde\xe4\xad\u3ff9\x1b\x18\xd0O\x9dC\xd4\xe5N\xb48\xe3jB*E\xa8\x14\x93R\xa3\xa19\xf8\x18\x18z\uba2e8\x05\x90&\x12\x17\x85\xa5\x12\xf46L\n\x18\xd0\r\xf4\xf6e\xb8\xfd\xa0\xa9\xe4\x1c#^\xedb\v\x15\xa5\x98Q&\x15\x1cb\ft]0p\x16\x03\xbd+\x01R\xa7\x99\xba\x04\xadRr\u03c5M4#\x87\xa5\xbb\xc4z\xab~\x8du\xc2\xff\xa7mm\\%\xb1\x16\x1d\xd9]\xfc\xdd\x02\x18\xd0\f\f!z~\x15\xb6\xa09)\xcf\xe8F/L\xf7u\x05\x87\xa5N\xa4\x994\x95\x81D\xa0\t\xc1\xd9\x1a0\u067d\x00\xa9c\xd5\x1e\x94RDJq8\x89\xf8\xa1_\xe5\u007f\xcc\x1d\xa1\xa9\u0db1K\xb9\xd8\xd0\xd1O\x9a\xbf\x15&\x8a\x1c\tV{t\x9d\b\xd6O{R0\xa8\xb7\xd3 \xfa\xc4\x11jJ\xb5\xa4\xd5\xf6\x95\"@g\x8f4P\xc2E\xd7Z@\t\x01\xe7\x1a:T\xaa\x8bO\xa6Vd\xc2\xc1(\xe4\xb1f\x8d\x1f\xfaU\xfe\u046f\x1e\x8b\xe78Bc2j\xb2\xcd)\x1e\x83\xa6\xe5\xdb(l%1i\x81s\xa6\x11\x12\xb5+\xa8j\xf4O1\xf2\x13\u02ecH\xa5\x98\x95\t\xfb\xa2\x88\x87\xfd\x06?\x89b>4\xb8\x85\x92nr.E\x01\xd5\"\a\xbb\xd5\xd70\x93b\x8d\xc4\u0527\xb0oU\xca|}\xfe(G\x92\xe8\xa4\nXM%\x99\x8a\x9b\x18*\xc1\x11`#1\u06a5t\x05,\x994&\x80J\x12\xf3R\xd8\xe01\u007f\x9e\u007fj\u05a8\xc9\xfe9\xde\xe3i\xad\xe1\xd0T\x92\x17\x82\x80\a\xfd\x06\x0f\xf8u\x9e\v\x03jR\xf2F\xa7HN\xb4\nF\x9d\v8f\x1b\x1a\x0f\x89#Z\x83\xf5@\xd4\xe8N\x80$\xf0\xc2\x19\xea\xcd\xf8IH^\xc6\xd8\xda\xf1+\x84\xd3u\xcb|\x12s4\ty\u00af\xf0Hc\x9e\x17\x82\x1aA\x1f\xee\x90U\xa4\xe4\xae\xea<\xf7\xd5k<\xd6lP>!\xd9\xec2;w\xc6-\xa2\x85\x81\xa8\x01\x8eP\xb8\v\v\x90E~d\xeb\xf6\xe8\xa4;\x01:\xbb\x98G\x13_\xc5XK\xb8|R)\x0e\xc5\x01\x8f6\xe6x\u032f\xf0j\u0620,\xfb\xfb0\xe1\x9ds34\xa4$:\x8d\xf5\x1d\xd6\xcdS&\xe9-\x14\x90\xd2\x01\x0f\x85+Z\xd0\x18m\x17a\xf1g\xa0UH\xbd\x9c\xf44@!\xe5$f@?y&\x9fk\u05ef\xf9\x9b\xea4O4\xe7\xa9\u0204\xf3E\xf3K\xa4\xb7\xdaBc\xe4\x149V\x02\xb0Px(\xf2\"\xc1l[\x1f\xb9\x84U/\xcb\x18_\xf50@sI\xccL\x12q!.\xb2]\xf4{o\xe8\xf3t\xb3\xca\x13~\x85\xe7\xc3:\x99\x8eW^\xd3\xd9\xee\u43d5\xb3\xb3P8(\\\xa1pQ\xe8\xed\u0147:\xc3\x02\xa4U\xc1#J-\x17{M\x00\x9a\x971\x87\xe2&\x9bc\x8b\xbf\xad\xce\xf0\x98?\u03c1(\xa0\xae\x92\x8c\x94\xd3:\xd8:#\x9a\x8e#$\x1e\x12\xbb\xed\xd3,\xf85\xe7\xd2s\x93qHC\xf5 @\x06\xad#\xbbow]nr4&\xe39\xbe5?I\x90\xf1qF\xbd\xd9\xf6\x18\x131F\x1b\x1ay\x86\x85\xc7R\xda\x1f\x87\xa9\x06_;\x0e\u0420\xa6\xf1\x06\xdb\xe1\x17\xf3E\xae\xb1].\xb2Z\x17\x14\xadOt\xb6\x98\x16/EaF\xc8\x19\xa6\x9d\u007f90\xb2d\xc5\u0573U %\xafF\xe9\xaea;\x02\x90+\x04\x17\x9b\x167zynp=\xaeq\xdc\xd6^\u05e2\u037d\x11\xdd\xc8\x00:\v\xbd\xd1\xceq\xa9\x99\xce)\x17_I^\x0e\xd3-w\x97\x1a@EMc\xaba\xb2\xd3q\xb9\xce\xcdq\x85e\xb3\xd9\\:f\xfa3\xae\xc7\xfd\x8d\x1aQ\xc6\xc9)\xa5\x03\x1f*\f\xad\xd8\xf2,X\xb2Y\x19s\xb8\x9b\xae{2\x81\u0346\xc9\r^\x8e\xeb]\x8f+m\x87\x11]?\x16\xf0Z\xea\xa1\x15p\xad\xe32\xa0\xebkV\x9a\xa4\xdb5f\x98\xbc\xcdI\xef\n\xd0\a\x1a\x15fS.\u03b5,\x80\x065\x9dk\x1d\x87\x0f\xe4\n\\\xeb\xb8l^\xe6\xf9\xee\x8bL\x8b7\xda\x0e\u007f\xdf\u0216\xee\xa7\xd2\xcfy\x03\xacO\xa9\xbe\xa4\x00\x9ej6R\xbfw~Y\x00\xdd\\(\xf2\x9f\x06GpVx\x02\xc0\xd54\xfeE\xae\x90\x01t\nm\xd0M~\xa50\x94Ze\xff\x97\u00c0g\x82\xf4\xfbY[^cB\xdc4\x0e\x0f\x02\xef\xcf\x15\xd8a\xd9\x191'X\x8b_+\x0esQ\x8a\xf5%\u007f\xe8W\x98\xea@m\xc9eQ\xf0R\x14\xa4\xb6\x9f\xe2i\x1a\x1f)\x94\xfa\xe2\x8cWZ\xba\xd2\xf6\xf8\xe5\xc2pj\xd3MM&|\xbfQ\xe9H[\x97\xf5\u07a6\x93\x84\xdd)\x9eY\u007f_\xae\xc0\xc5)^\x83\xd0\xcbr\x84\xe0\x93\xa5u\f\xe9\xe9,\x90\x05\xf0r\xd8\xe4\xe5\x0eU\xab_\x16@M\xa5\xb8\xbfQO-\x9dk\xcc0\xf8Xq \xa3\a\xf8\xe5\xfc0?\x93+\xa56u\t\xe0a\xbf\x9a\xfa\xeakE\x00)\xe0\xfb~\x03?\xa5\x90\xb8\x02>\\(q\xe5y\xee\v\xdd\xe8\x16\xb9}dc\xaa\xdfYNb\xee\xf7\xab\x1d\xab\xf0\xb6l\xd7\xe3\xf9\xa0\u0263\xcd\xf4\xac\x90\xa7i\xfc\xf9\xf8FrB\x9c\x97\xf0l1mn\x1b\u0798z\xaa\xdc\xc3~\x95\x17\x83\xce\xdd\u07b8l\x80b\xe0\xeej5\xb5\x86(`\x93ar\xdb\xd0\xe8Y7J@_8\xdf\xe3\xba\xc9\x1d\xa3\xafc}\xca~`]&\xdcU\x9d\xe9h\xf5\xd6\x15\xf5\xff\x83\x8d:\xcf\x05\xcd\u052c\x90\x02~\xbdX\xe2\xe6Bq\xc9\xcf\xe9\xc0E\xa6\xcb-\u00ef\xe3K\ubdb1\xc1\xe8]\a|\xa3a\xf2\xc7c[\u0611\xf2\x15\xe8\x02\xf8^}\x9e\xa7\x9b\x9d\xad\xf0\xb6\"W\u007fZ&|\xb7^c\x87\x9d^e,[h\xdc:8\u028ba\xc8\xd3As\x114\x02O\xd3x\xab[\xe2:o\x90]\xb9A\xa2\xf6\b\xb8]7\xb9u\xea\x15\xa6\x93\xde\xdaU\x1b\xd6\f\xee\x1c\xbd\x80\xed)\xc3\x03P\x95\t\xf7\xd4\xca\x1d/\u0435\xe2\x92\x10\xaf7-\xbe\xb3~3\xa3\x86\x91j\xa3^\b\x9a\xfc\xeb\xa9I\xaa\n.\xb6Z\x18\xe6\u04c3\xe3\x14\xf5\u03a4c\xbd\x1a6\xf9\xe8\xe1W;\x12yN\x1d \x80\r\xba\xc1w6lf\xeb2\x9c\xc0\x85XE\xa0\x14M\x04G\xa4\x81\xaf\f\x02\xa1c,\xa7\u0499\x92\xfc}\xf5\bw\xcdOq\xa8\u02e6\xb4m\xa6\u0367\x06\xc6xon\x00\xadC\xab\xcd@Jn9\xba\u007f\xd5n5J\xe5\xde\xf8\xaa\x92D\n\xde\xed\xe5\xce\xe9Nx\x03\u015c\x84C\x89\u0164\xb2)c\xd3\xc4\x04M_V\aK@\x13\x82\x9dN\x8e\xf7zy\xa6\xe2\x98W\xba\xa4\xca\xeb\u01ca#|~d3W9\xb9\xd4jh\x9fj0\xfe\xdf\xfa\x1c\u07e8L\xafZq\xd2\xd4nm\x1e\xd6t\xbe9\xbe\x81\x9d\x8e\xb7\xe4\x17.\x9c\xf3\xf6\xd1\u061f\xd8(\xcdBC\xad\xa8SE{\xea+\")\x88\x9f\x16)\x10\xc0C\x8d\n_,O\xb07\nV\xfd\xba\x04\x13\xc1\x1b\x1c\x8f\xdf\x1b\xde\xc4\xc5\xed\x8d\xd1N\xbe\xd6#q\xc4G\x0f\xbf\xba\xaa\xa5\x91S\xbd\xf6\xfb\x03\xb9\x02\u007f\xb8n=\xe6)R\x10B%y9\f\xb9\u07ef\xf3\x0f\x8d:o\xf6F\xb9\xa98\xb6\xac\x9f_8\xdeb\xa2\xf0\u06a7/\x1d\xa1N[\u062a&\x13\xfe\xae6\u01fd\xf5Y\x9e\r\xfcTO%\x9cJC\x9a\xc1[\xdc\x1c7\xe5\x06\xb8\xd1+ul\xbaZ\xacD)n\x9b>\xc8_\xd7V\xf7V\xa3T\x01\u0481;F\xc7\xf9p\xa1\xd4*\x92\xa0\x14\x13q\xcc\x03~\x9d\xef\u05ab<\x194\xa9I\xd9.\x18%\xf8\xca\xd86.wK\xe7\x04\x8e\x0e\xe4I\xf0\x04\xb8H4\xce>\xd9\xff\xa76\xcbC~\x95\x99$\xc6O\t\xa6\x9c\xd0x\x9diq\xa3W\xe2\xfd\x85A6\xea\x16\xc6*E\u0555R\xfc\xc9\xfcQ\xbe:;\x89\x84\xde\x05\b`\x93a\xf0\xb5u\x1b8\x9a\xc4<\xe87\xb8\xb7^=m\xca\xea&\xc3\xe2\v\ubdb1\xd9:\xfd\xb4\xb7\x10m\xb6\x90\xe4PxB\x9et\xbce9\xaa\u0244'\x9a5\x9eh\xd6\xd9\x13\x05\x1c\x88C\x8e\xc4\x11\x91R\xc4(\xa4R\u01e6;\xb2\x95\xe2\t\xd1\xe4\x05\xbf\xa6 Z\xd3\xd4B\xa1):\xe0G\xf82aN&\xd4d\xc2L\x920\x19\x87L%\x113IB\x82\xc2\x12\x02C\b\x864\x83\x8d\xa6\xc9\x06\xbdU\v{@\xd3\x19Zt\xd7\xd7Z\u8e60\xc1\xbf\x9b\xda\xc7\xfe5\xbaOM\xd0\x05%\x9a\u0797\x1f\xe2\x13C\x17`k\xad\xc2Sn\xdb\u06b8B\xa2\x03Y\xca\xfd\xa9\xb5?\n\xf8\xad\xa9}<\x1b\xfak\xd6\x06\xa3\x1b:\xe2oke\n\x9a\xc9'\a\xc6\x18\xd54\u0336C\x9cd\xf0\x9cV\x93q\u0217\xca\x13k\nO\xd7X\xa0\x05\xfdB~\x80\u06c77\x1fw\xb5u\xa6\x93u8\x0e\xb9u\xfa \x0f\xf9\xd55oK*\x81\u0134\xf4b\xd8\xe4p\x12q\xad\x93K%i\xbf\xdf$\x80\x03Q\xc0\xefL\x1f\xe4\x1f\x9b\xb5\xaeiS\xd7\r\xf6w{%>7\xbc\x89u\x86\x91Y\xa2E/jw\xe8s\xeb\xf4A\x9e\xe9\xa2K\xf8\xba\x12 \x80\x9dN\x8e/\x8flf\x93\x99\x1d\xf9A)\x9e\t\x1a|\xe6\xe8~\xf6u\xd9\xed\xd5]\v\x10\xc0\xa5\x96\u00ff\x1f\x1c\xe7]^\u9f35D\xa1\x92|\xbb:\xcb\x1f\xcf\x1f\xe1P\xdc}\xf9N]\r\x10\xb4*}\xfc\x9b\xd2:~s`\fR:\xa5\xd9+SV]&|\xb1<\xc1\xff\xae\xcev\xed\xc5\xc3]\x0f\u0402n\xf4\x8a\xdc>\xbc\x91q\xc3\xea{\x88\x04\xf0L\xb3\xc1\xef\x96\x0f\xf2\xe3\xc0\xef\xfa\xb6\xf6\xcc\xfb\xd8lX\xdc28\xce{r\x03\xab\xb6\u03f4\u06aa\u0284oU\xa6\xf9\xd3\xf9i\xa6{\xa02mO\x01\u051a\xd24\xde\xe6\xe6\xf9\xb7\x03c\xec\xb0\xdcU\xd9\xe9^\r\xc5J\xf1\x88_\xe5\x8f\xe6\xa7x\xaaY_\xf5M\xd1\xf3\x06\xa0\x05\x8d\xea\x06\x1f\xc8\x0f\xf2\xc1\xfc \xdbLgM\xf7\xa3V\xa2@J~\x1c4\xb8\xa7V\xe6{\xf5yjJ\xf6T\xfb{\x16\xa0\x85\u01af7L\xaew\v|\xa48\xca%)U\xb3X\xad\xb6?\xee\xd7\xf9\xb3J\xcb\xe2\x94{\xb4&vO\x03t\xa2Ez_n\x90\x9b\vC\xac7,\xbc.\xdd\x0e\xa9\u0244\x17\x02\x9f\xbb\xaa3|\xaf>\xdf\xd1C\u007f\x19@\xcb\x04\xe9j;\xc7\xf5^\x91]n\x9eq\xc3Z\u04c7\x14\xb4\x12\xbe^\b}\x1ei\xd6\xf8\x87z\x85\x97\"\x9f\xaa\x94}\xd1\xdf}\a\u0402\f\x04\xeb\x8c\x16L?\xeb\x15y\xb3\x93g\xd40W\xedac\xa5\xd8\x135y\u032f\xf1\xbd\xc6\xe4\x98n\xb2\u0574\xb9\xd6\xc9q\x85\xed1\xa2\x1bl2,\x06\xf4t\xf6\xdb&\xa2\x90Cq\xc8\xc18\xe4\xa9f\x9d\xe7C\x9f}q\xd8\xf7\xf7}\x9c\x17\x00\x9d\xf8\xc0:\x90\xd3tJ\x9aNNh\x8c\xe8&\x97\xda\x0e\x97\x98\x0e\x17Y\x0e#\xba\u0268nb.\xbe\x10Q)\xeaJ2\x15G\x1c\x88#\xf6GMvG\x01\xafFM\u6484\x8aL\x98\x97\t\x81\x92}ge2\x802uLY\xd2M\xa6\f\xa0L\x19@\x992\x802e\x00e\u0294\x01\x94)\x03(S\x06P\xa6\f\xa0L\x992\x802e\x00e\xca\x00\u0294\x01\x94)S\x06P\xa6\f\xa0L\x19@\x992\x802e\xca\x00\u02b4r\xfd\u007f\xc7d\x8eCj\x16c\x1f\x00\x00\x00\x00IEND\xaeB`\x82") func imagesAppleTouchIconPrecomposedPngBytes() ([]byte, error) { return _imagesAppleTouchIconPrecomposedPng, nil } func imagesAppleTouchIconPrecomposedPng() (*asset, error) { bytes, err := imagesAppleTouchIconPrecomposedPngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/apple-touch-icon-precomposed.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesConsoleSpritePng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x002\x00\x00\x00\x96\b\x06\x00\x00\x00\x9c\xb2\xdbI\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xc9e<\x00\x00\x01lIDATx\xda\xec\u0631J\x03A\x10\x00\xd0\xdd\x10\xae\xb3\x8a\x95W\xc7\xef\x88?`\x1d\xd0^\x10?G\x04k\x05{?\xc7\xf4I\xac\xed\xb3j\x13N\fwG\xc0\xe3v}S\x84\xe4\xb6\xc9cvnv'>=\xbf\xa4\x10B\f-q}\xb5\fc\x8fI\x17\"\x97\x984\xbe\xa7R \xb1\x14H\u05999\x04\x89\xa5@\xb2\xccL\x1b$\x96\x02\xc9*3} Q\x8d\xa8\x11}\xa4\xac>\xe2\xac5\x16H\u0599\xd8g!\xa5\"\x1c\xbd\x1a\"\b\b\b\b\b\b\b\b\xc8q1}]\u007ftN\xe3/\xcfN\xb2\u0208i\xbc\x1b\xe2@\xc5n\x8a2\xd6\u05efI\xe3X\x1b\xa2i\xbc\x1aQ#\xfa\x88\xb3\x96\xb3V\x1b\xc44\xdeU\x17\x04\x04\x04\x04\x04\x04\x04\x04\xa4\x8c\xd3\xef\xfd\xc3\xe3~\xe1\xee\xf6f\u043b\xca\xc5b\x11:\xae\xe0\xd1\xd6\x02\x019\xa2\u061b\x85\xdd7\xfe\xf2\x05\xf0U\xec\xe9\xdffd\xfa\xfd\xb1\u066c\u007f<\xac\xaa*\xccf\xa7\xfb\xdf\xef\xdbm\u0625\xdd`\u007f\xeam\xb5\xfa\xf5\xec|>o]\x1fe\x1f\xa9\xeb\xfa\x10$5 \xb1\xec\xad5\xb6hn\xa3\xbe\xeb\xfaH6\x87F\x19\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01i\x8dO\x01\x06\x00\b\xd2N\r\xb96x\x0f\x00\x00\x00\x00IEND\xaeB`\x82") func imagesConsoleSpritePngBytes() ([]byte, error) { return _imagesConsoleSpritePng, nil } func imagesConsoleSpritePng() (*asset, error) { bytes, err := imagesConsoleSpritePngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/console-sprite.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesFaviconIco = []byte("\x00\x00\x01\x00\x04\x0000\x00\x00\x01\x00 \x00\xa8%\x00\x00F\x00\x00\x00 \x00\x00\x01\x00 \x00\xa8\x10\x00\x00\xee%\x00\x00\x10\x10\x00\x00\x01\x00 \x00h\x04\x00\x00\x966\x00\x00@@\x00\x00\x01\x00 \x00(B\x00\x00\xfe:\x00\x00(\x00\x00\x000\x00\x00\x00`\x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb#/!\xdbf/!\u06dd/!\xdb\xc8/!\xdb\xe4/!\xdb\xf6/!\xdb\xff/!\xdb\xfe/!\xdb\xf4/!\xdb\xe3/!\xdb\xc7/!\u06d9/!\xdb`/!\xdb\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x04/!\xdb]/!\xdb\xc0/!\xdb\xe6/!\xdb\xf1/!\xdb\xfa/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf9/!\xdb\xf1/!\xdb\xe7/!\u06fb/!\xdbZ0 \xdc\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbb/!\xdb\xd6/!\xdb\xf5/!\xdb\xfe/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfd/!\xdb\xf8/!\xdb\xd4/!\xdb]/!\xdb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb2/!\xdb\xc0/!\xdb\xfa/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfe/!\xdb\xff/!\u06fe/!\xdb(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbh/!\xdb\xea/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf6/!\xdb[/!\xdb\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdd\t/!\u06c5/!\xdb\xfd/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb}/!\xdb\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001!\xcb\r/!\u060b/!\xda\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfe/!\xdb\xfd/!\xdb\xfe/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06cc/!\xdb\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x01'\"\xea\x0f'\"\xea\x0e'\"\xea\x04\x00\x00\x00\x002!\xcb\b4 \xbd\x804 \xbd\xff2!\xc7\xff0!\xd3\xff/!\xd9\xff/!\xda\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf6/!\xdb\xef/!\xdb\xe9/!\xdb\xd0/!\u06fd/!\u06ff/!\xdb\xd2/!\xdb\xe8/!\xdb\xef/!\xdb\xf7/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\u007f/!\xdb\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x16'\"\xea\xc6'\"\xea\xbc'\"\xea]&\"\xee\x1e1 \xc4b4 \xbb\xfc4 \xb9\xff4 \xb9\xff4 \xb9\xff3 \xbf\xff1!\xcb\xff0!\xd5\xff/!\xd9\xff/!\xda\xff/!\xdb\xff/!\xdb\xef/!\xdb\xce/!\xdbx/!\xdb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb3/!\xdb}/!\xdb\xc9/!\xdb\xf2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'!\xea\x03'\"\xeaz'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xe8\xf9,!\xd9\xeb1 \xc6\xff3 \xbf\xfe4 \xbc\xff4 \xba\xff4 \xb9\xff4 \xb8\xff4 \xba\xff3!\xc3\xff1!\xd1\xf7/!\xda\xc8/!\xdbW\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbX/!\xdb\xc4/!\xdb\xf8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf8/!\xdb)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea '\"\xea\xf6'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xec\xff'\"\xec\xfe)\"\xe2\xfe/!\xcf\xe64 \xbd\xcd4 \xba\xe14 \xba\xfb4 \xba\xff4 \xb9\xf03 \xbf\x8b2\x1f\xbb\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x0f/!\u06c7/!\xdb\xeb/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06ff/!\xdb\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x8c'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeb\xf6%\"\xf0s+!\xe2\x104 \xbdF4 \xbc\x944 \xbb\xc63 \xbdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbe/!\xdb\xe4/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb]\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x11'\"\xea\xef'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\x9f'\"\xe9\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.#\xd1\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbe/!\xdb\xec/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd7/!\xdb\x05\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea['\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xd5'\"\xea7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06c8/!\xdb\xf8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfb/!\xdbW\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xb8'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xfc'\"\xea\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x10/!\xdb\xc2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfd/!\u06fc\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea`'\"\xea\xa7'\"\xea\xe5'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xd9'\"\xea@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbY/!\xdb\xf0/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xec/!\xdb\x1b\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x18'\"\xeaD'\"\xeau'\"\xea\xb7'\"\xea\xf6'\"\xea\xff'\"\xeb\xb5\x18'\xff\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000\x1b\xca\x01/!\xdc\xcb/!\xdc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf4/!\xdb`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\"'\"\xebG(\"\xe6\x90*!\u07d4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\u0486/!\xd7\xf7/!\xdd\xff/!\xdc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfa/!\u06da\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002 \xc9B3 \xc6\xef4 \u00f14 \xc3l4 \xc3\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003!\xbfK3 \xc0\xf03 \xc5\xff1!\xcf\xff/!\xd9\xff/!\xdd\xff/!\xdc\xff/!\xdb\xff/!\xdb\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005 \xc1b4 \xc3\xff4 \xc4\xff4 \xc3\xef4 \xc3\xd84 \u00e84 \xc3T4!\xc3\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea>'\"\xeaC\x00\x00\x00\x00<\x1f\x9d\x114 \xb8\xe94 \xba\xff4 \xbd\xff3 \xbf\xff2 \xc6\xff1!\xd0\xff/!\xdb\xff/!\xdd\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\f/!\u06d7/!\xdc`4!\xc5\x1b:!\xac\u007f9!\xb1\xff7!\xb9\xff4 \xc0\xff4 \xc4\xff4 \xc4\xfc4 \xc3\xef4 \xc3\xca4 \xc3.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xeap'\"\xea\xdd'\"\xea\xd5&\"\xed\x841 \xc3\xeb5 \xb8\xff4 \xb8\xff4 \xb9\xff4 \xbb\xff4 \xbd\xff3 \xbf\xff2 \xc6\xe41 \xcc\x14\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x10/!\xdb\xdf/!\xdb\xf5/!\xda\xe62!\xcd\xe57!\xb7\xfc:!\xad\xfd:!\xad\xff9!\xb3\xff6 \xbc\xff4 \xc3\xff4 \xc4\xdc4 \xc40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea|'\"\xea\xf5'\"\xea\xff'\"\xea\xf6(\"\xe7\xfd*\"\xdf\xfb/!\xcf\xf93 \xbe\xfb4 \xb9\xff4 \xba\xff4 \xba\xff4 \xbb\xe62!\xc1#\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x10/!\xdb\xe0/!\xdb\xff/!\xdb\xff/!\xda\xff/!\xda\xfe1!\xd4\xfb4!\xc4\xf89!\xb4\xfd:!\xad\xff:!\xb0\xff8!\xb5\xd06!\xba+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x92'\"\xea\xfb'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xe9\xff(\"\xe8\xff.!\u04044 \xbd\xb04 \xbc\xff4 \xba\xed4 \xbd&\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x0f/!\xdb\xd3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06785!\xbf]:!\xae\xa59!\xaf\xc89!\xaf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xb3'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'#\xe8&:\x1f\xac\x032 \xc5\x173 \xc1[4 \xbc\x16\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\f/!\u06fc/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xca/!\xdb3\x00\x00\x00\x007!\xbc\x067!\xbb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea!'\"\xea\xcb'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xf9#&\xee\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\t/!\u06d8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xea/!\xdbR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea`'\"\xea\xe8'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x05/!\xdbh/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xa9'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb0/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06fc/!\xdb'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea%'\"\xea\xb0'\"\xea\xef'\"\xea\xf8'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x14/!\xdb\xd8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfe/!\xdbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea1'\"\xea\x8d'\"\xea\xd3'\"\xea\xeb'\"\xea\xfc'\"\xea\xff'\"\xea\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\n/!\u06c2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc2/!\xdb+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x03'\"\xeaL'\"\xeb\xa0(\"\xe7\xed)\"\xe4u\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb2/!\xdb\xfd/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06d0/!\xdb\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002!\u02703 \u015e4 \xc3P4 \xc3+4 \xc3\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x10/!\u06e1/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdbz/!\xdb\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x11/!\xdb*/!\xdb\x11\x00\x00\x00\x00\x00\x00\x00\x007!\xb8f5 \xc0\xfb4 \xc3\xff4 \xc4\xff4 \xc3\xd24 \u00c94 \xc3K4 \xc3&4 \xc3\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb>/!\xdb\xf5/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf9/!\xdb~/!\xdb\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x13/!\u06c7/!\xdb\xc6/!\u06d8.!\xddW4!\xc3Z:!\xb0\xec8!\xb3\xff7 \xb9\xff5 \xbd\xff5 \xc1\xff4 \xc4\xff4 \xc4\xfe4 \u00fe4 \xc3n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\f/!\u06ca/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06de/!\xdb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb5/!\u06e2/!\xdb\xf9/!\xdb\xff/!\xdb\xff/!\xdc\xf91!\xd1\xf44!\xc5\xfc7!\xbb\xfb9!\xb2\xfb:!\xb0\xff8 \xb4\xff7 \xb9\xff6 \xbe\xff5 \xc1\xff4 \u00df\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb%/!\xdb\xc6/!\xdb\xff/!\xdb\xfe/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xcf/!\xdb~/!\xdb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb3/!\xdb|/!\xdb\xd2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc\xff.!\xde\xff0!\xd8\xfb2!\xcf\xff6!\xc2\xd4:!\xae\xb5:!\xae\xec9!\xb1\xff8 \xb6\xdb2 \xc7\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbH/!\xdb\xe3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xce/!\u06de/!\xdbn/!\xdbJ/!\xdb1/!\xdb#/!\xdb$/!\xdb0/!\xdbH/!\xdbm/!\u06da/!\xdb\xcd/!\xdb\xfc/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc\xff/!\xdd\xf2.!\xe1E8!\xb5!9!\xb1O:!\xb1\u007f:!\xae^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdb\x03/!\xdbc/!\xdb\xef/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf3/!\xdb\xdd/!\xdb\xce/!\xdb\xc5/!\xdb\xc5/!\xdb\xcd/!\xdb\xdb/!\xdb\xf3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfd/!\xdb^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\xff\x010!\xca\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x06/!\xdbl/!\xdb\xef/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfc/!\xdbc/!\xdb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdb\x05/!\xdb\\/!\xdb\xe3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xeb/!\xdbU/!\xdb\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdb\x03/!\xdb:/!\xdb\xc2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc0/!\xdb8/!\xdc\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x14/!\xdbz/!\xdb\xf3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf4/!\xdbw/!\xdb\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x05/!\xdb$/!\u06ce/!\xdb\xf6/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf3/!\u06d1/!\xdb(/!\xdb\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x04/!\xda\x16/!\xdbi/!\xdb\xc2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc8/!\xdbg/!\xdb\x1a/!\xdb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x01/!\xdb\x02/!\xdb\x0f/!\xdbF/!\xdbv/!\u06db/!\u06f5/!\xdb\xc0/!\xdb\xc4/!\u06f7/!\u06df/!\xdby/!\xdbG/!\xdb\x14\x00\x00\x00\x00/!\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xf0\x03\xff\xff\x00\x00\xff\xff\x80\x00\u007f\xff\x00\x00\xff\xfe\x00\x00\x1f\xff\x00\x00\xff\xf8\x00\x00\a\xff\x00\x00\xff\xf0\x00\x00\x03\xff\x00\x00\xff\xc0\x00\x00\x01\xff\x00\x00\xff\x80\x00\x00\x00\u007f\x00\x00\xff\x00\x00\x00\x00\u007f\x00\x00\xe7\x00\x0f\xfc\x00?\x00\x00\xe0\x00?\xff\x00\x1f\x00\x00\xc0\x00\u007f\xff\x80\x0f\x00\x00\x809\xff\xff\xe0\x0f\x00\x00\x80?\xff\xff\xf0\a\x00\x00\x80\u007f\xff\xff\xf0\a\x00\x00\x00\u007f\xff\xff\xf8\x03\x00\x00\x80\xff\xff\xff\xfc\x03\x00\x00\xf0\xff\xff\xff\xfc\x03\x00\x00\xfc\xff\xff\xff\xfc\x01\x00\x00\xfe\u007f\xff\xff\xfe\x01\x00\x00\xfe\x0f\xff\xff\xfe\x01\x00\x00\xee\x03\xff\xff\xf0\x01\x00\x00\xe0\x03\xff\xff\xf0\x01\x00\x00\xe0\x03\xff\xff\xe0\x01\x00\x00\xe0\x13\xff\xff\xe0\x1f\x00\x00\xe0\x1f\xff\xff\xe0\x1f\x00\x00\xe0\x1f\xff\xff\xe0\x1f\x00\x00\xf0\x1f\xff\xff\xc0\x1f\x00\x00\xf0\x0f\xff\xff\xc0?\x00\x00\xf0\x0f\xff\xff\xf0?\x00\x00\xf0\a\xff\xff\xfe\u007f\x00\x00\xf8\x03\xff\xff\xff?\x00\x00\xf8\x03\xff\xff\xff\a\x00\x00\xfc\x01\xff\xff\xc6\x01\x00\x00\xfc\x00\u007f\xff\x80\x00\x00\x00\xfe\x00?\xff\x00\x01\x00\x00\xff\x00\a\xf8\x00?\x00\x00\xff\x80\x00\x00\x00\u007f\x00\x00\xff\xc0\x00\x00\x00\xff\x00\x00\xff\xe0\x00\x00\x01\xff\x00\x00\xff\xf0\x00\x00\x03\xff\x00\x00\xff\xfc\x00\x00\x0f\xff\x00\x00\xff\xfe\x00\x00\x1f\xff\x00\x00\xff\xff\xc0\x00\xff\xff\x00\x00\xff\xff\xfc\x0f\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x010\"\xd9\x04/!\xdbS/!\u06fc/!\xdb\xfe/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd4/!\xdbt/!\xdc\x0e/!\xdb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb%/!\u06f4/!\xdb\xf5/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xce/!\xdb[\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x05/!\u06c0/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc7/!\xdb\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xe3\x04/!\xdb\xdc/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfa/!\xdbB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002!\xca\x0f1!\xcf\xe3/!\xd9\xff/!\xdc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf7/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfe/!\xdb\xff/!\xdbJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xbc'\"\xeaY\x00\x00\x00\x003 \xbd\xe44 \xba\xff4 \xba\xff2!\xc5\xff0!\xd7\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfc/!\u06e8/!\xdb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x19/!\xdb~/!\xdb\xf2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x8f'\"\xea\xff'\"\xea\xff'\"\xe8\xfb+!\xdb\xff0!\xcb\xfa4 \xbc\xff4 \xb9\xff4 \xb9\xff3 \xbf\xff0!\u050c/!\xdb\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x03/!\xdbV/!\xdb\xf8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xe2/!\xdb\b\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x17'\"\xea\xf4'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeb\xf7%\"\xf3\x174 \xbco4 \xbb\xde3 \xbfU\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\a/!\xdb\xde/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdbr\x00\x00\x00\x00\x00\x00\x00\x00'\"\xeaY'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xfc'\"\xea;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdc\x11/!\xdb\xf9/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\r\x00\x00\x00\x00'\"\xea\xc4'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb//!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb{\x00\x00\x00\x00'\"\xea\x16'\"\xea\xa3'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06ef/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc2/!\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\t'\"\xeaI)\"\xe4\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xd3V/!\xd8\xff/!\xdd\xff/!\xdb\xff/!\xdb\xff/!\xdb\xec/!\xdb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005 \u00974 \xc3\xff4 \u00dd4 \xc3&4 \xc3\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x06'\"\xea\t6!\xb5\x1b4 \xb9\xff3!\xc3\xff0!\xd3\xff/!\xd9\xff/!\xdb\xff/!\xdd\a\x00\x00\x00\x00\x00\x00\x00\x00/!\u06d0/!\xdb\x1a:!\xad\xb78!\xb7\xff4 \xc2\xff4 \xc4\xff4 \xc3\xe74 \xc3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea<'\"\xea\xe2&\"\xee\x943 \xbe\xff5 \xb8\xff4 \xb9\xff4 \xbc\xff3 \xc2\xff2 \xc9.\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xf6/!\xdb\xff1!\xd1\xfc6!\xbe\xfb9!\xb2\xfc9!\xb3\xff6 \xbc\xff5 \xc0`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xeaG'\"\xea\xfe'\"\xea\xff&\"\xed\xff*\"\xe0\xfb/!\xcc\xf44 \xbb\xe04 \xba\xff3!\xbdD\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xe8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff3!\xcb^:!\xaf\xbe9!\xaff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xeaf'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xd4-\"\xd6\x043 \xc3-4 \xbd!\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xcb/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdcr\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xb2'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06da/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\n'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeaY\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\\/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf5/!\xdb\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x0e'\"\xea_'\"\xea\xde'\"\xea\xff'\"\xea\xff'\"\xea\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x1b/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06eb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea-'\"\xea\x9d*\"\xe2\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06ed/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdbx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004 \xc4H4 \xc3\xff4 \xc3\xe34 \xc3W\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\r/!\xdb\xf6/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdbx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb:/!\xdb\xd6/!\u06e62!\xcdo:!\xaf\xff8!\xb4\xff6 \xbc\xff4 \xc3\xff4 \xc4\xf54 \u00e8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06c0/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06ff/!\xdb\x13/!\xda\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\t/!\xdbr/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc\xfd4!\xc6\xf9:!\xb0\xf2:!\xad\xf98!\xb7\xff4 \xc1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06f2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfb/!\xdb\xd2/!\u06c7/!\xdbL/!\xdb1/!\xdb>/!\xdbm/!\u06fb/!\xdb\xec/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc\xfa/!\xde\x179!\xb1#9!\xb3VN#g\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xdb\x01\x1f \xdf\x01/!\xdb\xc8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf5/!\xdb-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06eb/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xee/!\xdc\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbe/!\xdb\xef/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06da/!\xdb\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06cd/!\xdb\xf4/!\xdb\xfc/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf7/!\xdb\xc5/!\xdb\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\v/!\xdb3/!\xdbh/!\u06df/!\xdb\xc3/!\xdb\xd1/!\xdb\xcc/!\u06f0/!\xdb\u007f/!\xdbB/!\xdb\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x0f\xff\xff\xc0\x01\xff\xff\x00\x00\u007f\xfe\x00\x00?\xfc\x00\x00\x1f\xd8\x03\xf0\x0f\x80\x0f\xfc\a\x81\xbf\xfe\a\x83\xff\xff\x03\x03\xff\xff\x83\x87\xff\xff\x81\xf7\xff\xff\xc1\xf1\xff\xff\xc1\xd0\u007f\xff\x01\xc0\u007f\xff\x01\xc1\u007f\xff\a\xc1\xff\xfe\a\xc0\xff\xfe\x0f\xe0\xff\xff\x0f\xe0\u007f\xff\xcf\xe0\u007f\xff\xe7\xf0?\xfe@\xf0\x0f\xfc\x01\xf8\x01\xe0\x0f\xfc\x00\x00\x1f\xfe\x00\x00?\xff\x80\x00\u007f\xff\xc0\x01\xff\xff\xfc\x1f\xff\xff\xff\xff\xff(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\a/!\xdbN/!\xdb\xd3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06ec/!\xdb+/!\xdb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdf%/!\xdb\xdc/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06f6/!\xdb\x05/!\xdb\x01\x00\x00\x00\x00'\"\xea\x04'\"\xea\"2 \xc002!\xcd\xff0!\xd7\xff/!\xda\xff/!\xdb\xeb/!\xdb\xd0/!\xdb\xc0/!\xdb\xd9/!\xdb\xf7/!\xdb\xff/!\xdb\xff/!\u06ff\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea?'\"\xea\xf8(\"\xe6\xf3/!\xcf\xe04 \xbb\xfa2 \u0192.!\xe1\x12\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x02/!\xdb /!\xdb\xd1/!\xdb\xff/!\xdb\xff/!\u06dc\x00\x00\x00\x00'\"\xea\xbc'\"\xea\xff'\"\xea\xf6\x17%\xff\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x06/!\xdb\xec/!\xdb\xff/!\xdb\xf0/!\xdb\x11'\"\xea>'\"\xea\xd1'\"\xeb\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb2/!\xdc\xff/!\xdb\xff/!\xdbJ\x00\x00\x00\x00\x00\x00\x00\x005!\xbe\x9d3 \xc5s3 \xc5%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\r*\"\xe0;3!\xc4\xed1!\xd0\xff0!\u0594/!\xdb\x14/!\xdb\xea3!\xcb\xf99!\xb4\xff7!\xba\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea.'\"\xea\xff)\"\xe4\xfe1!\xc7\xe34 \xbb\xb3/!\xdb\r/!\xdb\xee/!\xdc\xff.!\xde\xcdE!\u007f\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xeaj'\"\xea\xff'\"\xea\xff%\"\xf1H4\x1f\xc5\x04\x00\x00\x00\x00/!\xdb\xda/!\xdb\xff/!\xdb\xff/!\xdb\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea]'\"\xea\xf4'\"\xea\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbQ/!\xdb\xff/!\xdb\xff/!\u06e4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008 \xcb\x05\x00\x00\x00\x002 \u02b84 \xc4u3 \xc5\x19\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xcc/!\xdb\xff/!\xdb\xff/!\u06f5/!\xdb\x0f/!\xdb\x04/!\xdb\x02/!\xdb\x05/!\xdb\x1e/!\xdb\xe7/!\xda\xfe6!\xc0\xfc8!\xb4\xf55 \xc0\xe1\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb /!\xdb\xfc/!\xdb\xff/!\xdb\xff/!\xdb\xf1/!\xdb\xc7/!\u06fc/!\xdb\xd1/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u076c8!\xb9\n/!\u06dd/!\xdb\xd8/!\xdb\xe7/!\xdb\xca/!\u06c1/!\xdb*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\xf0\a\x00\x00\xe0\x03\x00\x00\x83\xe1\x00\x00\x1f\xf1\x00\x00\x9f\xf9\x00\x00\xdf\xf8\x00\x00\x87\xf0\x00\x00\x8f\xf3\x00\x00\x8f\xf3\x00\x00\xc7\xfb\x00\x00\xc3\xe0\x00\x00\xe0\x03\x00\x00\xf0\a\x00\x00\xfc\x1f\x00\x00\xff\xff\x00\x00(\x00\x00\x00@\x00\x00\x00\x80\x00\x00\x00\x01\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb)/!\xdbx/!\u06f8/!\xdb\xdc/!\xdb\xed/!\xdb\xf8/!\xdb\xfe/!\xdb\xff/!\xdb\xfc/!\xdb\xf3/!\xdb\xe6/!\xdb\xd5/!\u06de/!\xdbU'\x12\xe3\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\r/!\xdbD/!\u06d8/!\xdb\xf4/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd0/!\xdbs/!\xdb/\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06ca/!\xdb\xf4/!\xdb\xfd/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfb/!\xdb\xe3/ \xdbK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xdb\v/!\u06c3/!\xdb\xf4/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd2/!\xdbZ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xdb@/!\xdb\xf8/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd0/\x1e\xdc\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x01/!\u06ee/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf9/!\xdbw\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb#/!\xdb\xed/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06ed/ \xdb\b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xddJ/!\xdb\xf7/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xdc/!\xdb\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdd@/!\xdb\xfe/!\xdb\xfe/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xdb/!\xdb\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003 \xc5T4 \xbe\xff1!\xd1\xff/!\xdd\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xea/!\xdb\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea7'\"\xea7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xd0\x1e4 \xbc\xf34 \xba\xff4 \xb8\xff4 \xbc\xff2 \xc8\xff0!\xd3\xff/!\xdc\xff/!\xdc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xda/!\u06ec/!\u06c6/!\xdbi/!\xdbU/!\xdbT/!\xdb]/!\xdbt/!\u06d2/!\u06fd/!\xdb\xf0/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x01'\"\xea\xe4'\"\xea\xff'\"\xea\xeb'\"\xeaj'\"\xea\a0\"\xde\v3 \xbd\xf94 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff2!\xcc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06dd/\"\xdb\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb9/!\xdb\xd2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06f1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xa2'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xf6)\"\xe3\xd80!\xc9\xfb4 \xb9\xfc4 \xb8\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xb9\xff4 \xbb\xff3 \xc2\xff1!\xce\xff0!\xd9\xff/!\xdb\xf6/!\xdbs0!\xdb\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb,/!\u06e2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff.!\xdaE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea0'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeb\xff'\"\xeb\xfa-!\xd5\xf93 \xc0\xfb4 \xbc\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xb9\xff2 \xc8\xcd)\"\xf3\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb;/!\xdb\xed/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff-!\xd7\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xa4'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeb\xff'\"\xea\xff*\"\xe1\xbb3 \xc0{4 \xbc\xe94 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff2 \xc2t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdc\n/!\u06f2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06e61!\xdb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\"\xea\x0f'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003 \xc3B4 \xbd\xaf4 \xbb\xe13 \xbf]\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06d6/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfc/!\xdb\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xaf'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xf7'\"\xea\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002 \xc1\n,'\xca\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06ce/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'#\xe9\x11'\"\xea\xf2'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeah\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x01\x00\x00\x00\x00/!\xdb\xc2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea9'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002$\xdb\b/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06cd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x8e'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeaQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbM/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x98'\"\xea\xf1'\"\xea\xfe'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xfa'\"\xea\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x04/!\xdb\xdb/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff0!\xdb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\"\xeb\x14'\"\xeaE'\"\xea\xb3'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdbP/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06e4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'#\xea\f'\"\xea\x81'\"\xea\xd4'\"\xea\xfb'\"\xea\xff'\"\xea\xff(\"\xea\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xe9/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\"\xec\x05'#\xea\x1b'\"\xea\x80&\"\xeb\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\u007f/!\xdc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf9/!\xdb\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005 \xc1\xdf4 \u00f24 \xc3V4 \xc3\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005 \xb9K3!\xbf\xff2!\xcc\xff0!\xd5\xff/!\xdc\xff/!\xdc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfc/!\xdb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002 \xc1\n4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xfd4\x1f\u00fa3 \xc3*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004 \xba+4 \xba\xfb4 \xba\xff4 \xba\xff4 \xbc\xff1!\xcc\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdbN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007 \xbbT5 \xc1\xff4 \xc4\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xda4 \u00d24\x1f\xc37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'!\xeaY'\"\xea\x88'\"\xec*\x00\x00\x00\x007 \xb4\r4 \xba\xf94 \xba\xff4 \xba\xff4 \xba\xff4 \xb9\xff4 \xba\xff3 \xc3\xff1!\xcd\xff0!\xd8\xff/!\xdd\xff/!\xdcl\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06f0/!\xdbQ/!\xdc\v\x00\x00\x00\x009!\xb2\x8d:!\xac\xff8!\xb3\xff5 \xbf\xff4 \xc2\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xebj'\"\xea\xff'\"\xea\xff'\"\xea\xd6%\"\xf0H3 \xbd\xf44 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xb8\xff3 \xc2\xff1!\u03cb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xe0/!\xdb\xff/!\xdb\xee/!\u07386!\xc0\xd8:!\xab\xfe:!\xac\xff:!\xad\xff9!\xb0\xff8!\xb5\xff5 \xbf\xff4 \xc4\xff4 \xc3\xff4 \xc3\xff4 \u00fb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xeat'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff(\"\xe7\xfb*\"\xdd\xf80!\xca\xf95 \xb8\xfd4 \xb9\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xba\xff4 \xbc\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xe1/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc\xff/!\xda\xf94!\xc5\xf38!\xb4\xfd:!\xae\xfc:!\xac\xff:!\xac\xff9!\xb1\xff6 \xbb\xff5 \xc1\xff4 \u00e0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x93'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xec\xff'\"\xea\xf6-!\xd4\xf72 \xc1\xf34 \xbb\xf94 \xba\xff4 \xba\xff4 \xba\xff3 \xbc\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xde/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xda\xfe0!\xd6\xfc4!\xc6\xf59!\xaf\xfd:!\xad\xff:!\xad\xff:!\xae\xff9!\xb2\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xc6'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xe9\xa29 \xae\x132 \u00c14 \xbd\xfa4 \xba\xff4 \xba\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xd3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc\xff.!\u07c49!\xb1L9!\xaf\xb1:!\xae\xea9!\xb0\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'#\xeav\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002 \xc7L4 \xbfk\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xc3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06f4\x00\x00\x00\x006 \xbc\x019!\xb0\x048!\xb8\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea-'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06ea/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd50 \xdb\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xear'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xfa'\"\xea\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06cb/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xed/!\xdb\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xc1'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xe8'\"\xea\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbW/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/ \xdb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x1e'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x1c/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06ff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\xbf'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xeam\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xe3/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff1!\xdb)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x14'\"\xeaH'\"\xea\xc0'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbo/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06eb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x1d'\"\xea\x89'\"\xea\xd1'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xff'\"\xea\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x14/!\xdb\xf9/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff0\"\xdb\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\"\xea\x04&!\xe9\x18'\"\xea\x94'\"\xea\xff'\"\xea\xfd'\"\xea<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xdb\x03/!\xdb\xcc/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xea.!\xdb\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\"\xca\x1a0 \xcf\xf03 \xc6`8 \xc3\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbZ/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06e7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004 \u00da4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \u00e84 \xc3\x1e5 \xc4\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xdd/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06de\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-!\xdb\x12/!\xdb\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008!\xb6^4 \xc3\xff4 \xc4\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xd74 \u00d24 \xc3)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdaA/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06c7+!\xd9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x10/!\xdb\xd9/!\xdb\xff/!\xdb\xc7/!\xdcE/!\xdd\x119!\xaf9:!\xad\xff:!\xac\xff8!\xb5\xff5 \xbf\xff4 \xc2\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \xc3\xd95 \xc3M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x16\xd7\x01/!\xdb\xd7/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xc8/\x1a\xd8\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb9/!\xdb\xeb/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xea1!\xd0\xeb7!\xb7\xf3;!\xaa\xff:!\xac\xff:!\xad\xff:!\xaf\xff8!\xb3\xff6 \xbe\xff4 \xc4\xff4 \xc3\xff4 \xc3\xff4 \xc3\xff4 \u00e4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\x1c/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf7/!\xdbN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/ \xda\x0e0!\u06c0/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdd\xff0!\xd8\xf74!\xc3\xf08!\xb6\xfb:!\xae\xfa:!\xad\xff:!\xac\xff:!\xaf\xff7!\xb8\xff5 \xbf\xff4 \xc2\xf8c \x9f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbh/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfe/!\xdb\xe8/!\xdb<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdbq/!\xdb\xf9/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xda\xfe0!\xd8\xf16!\xb9\x9b9!\xb1\xff:!\xad\xff:!\xad\xff:!\xad\xff9!\xb1m\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\u06f4/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd9/!\u06c3/!\xdbA/!\xdb\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xda\x1f/!\xdbP/!\u06d7/!\xdb\xef/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdba\x00\x00\x00\x00\x00\x00\x00\x006!\xb9Q8!\xb4\xa79!\xb0\xc98\x1e\xb4\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\xd2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf8/!\xdb\xcb/!\u06e8/!\u06e7/!\u06f2/!\xdb\xd2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/ \xdb\x17/!\xdb\xea/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06e1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000 \xd8\t/!\xdb\xe2/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06e5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdb\x0f/!\xdb\xca/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdc~/3\xd5\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002!\xda\x01\x00\x00\x00\x00/!\u06ee/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf6/!\xdbl\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007\x14\xde\x01/!\xdbL/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xe4.\x1f\xdc\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/#\xdb\x12/!\u06e9/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xf5/!\xdb~\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000!\xda\x19/!\xdb\xd5/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\u06e0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xda5/!\u06d1/!\xdb\xf4/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xd6/!\xdbq/!\xdb\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.!\xdbK/!\u06fb/!\xdb\xec/!\xdb\xf5/!\xdb\xfe/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xff/!\xdb\xfc/!\xdb\xf3/!\xdb\xe7/!\u06e3/!\xd9)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/!\xdb\b/!\xdb /!\xdb4/!\xdbR/!\xdbw/!\u06d2/!\u06dd/!\u06e5/!\u06df/!\u06ce/!\xdbq/!\xdbJ/!\xdb0/!\xdb\x1a/!\xdb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x01\xff\xff\xff\xff\xff\xff\x00\x00?\xff\xff\xff\xff\xf8\x00\x00\a\xff\xff\xff\xff\xe0\x00\x00\x01\xff\xff\xff\xff\xc0\x00\x00\x00\u007f\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfe\x00\x00\x00\x00\x0f\xff\xff\xfc\x00\x00\x00\x00\a\xff\xff\xf8\x00\x00\x00\x00\x03\xff\xff\xf0\x00\x00\x00\x00\x01\xff\xff\xe0\x00\x01\xf0\x00\x00\xff\xf1\xc0\x00\x1f\xff\x00\x00\u007f\xe0\x00\x00\xff\xff\xc0\x00\u007f\xe0\x00\x01\xff\xff\xf0\x00?\xc0\x01\a\xff\xff\xf8\x00\x1f\xc0\x03\xcf\xff\xff\xfc\x00\x1f\x80\a\xff\xff\xff\xfe\x00\x0f\x80\x0f\xff\xff\xff\xff\x00\x0f\x80\x0f\xff\xff\xff\xff\x80\a\x00\x1f\xff\xff\xff\xff\xc0\a\x00\x1f\xff\xff\xff\xff\xc0\a\xe0\x1f\xff\xff\xff\xff\xe0\x03\xf8?\xff\xff\xff\xff\xe0\x03\xff?\xff\xff\xff\xff\xf0\x03\xff\x9f\xff\xff\xff\xff\xf0\x03\xff\x83\xff\xff\xff\xff\xf0\x03\xff\x80\u007f\xff\xff\xffp\x03\xf7\x00\x1f\xff\xff\xff\x10\x01\xf0\x00\x1f\xff\xff\xff\x00\x01\xf0\x00\x1f\xff\xff\xfe\x00\x01\xf0\x00\x1f\xff\xff\xfe\x00!\xf0\x01\x1f\xff\xff\xfe\x00\u007f\xf0\x01\xff\xff\xff\xfe\x00\u007f\xf0\x01\xff\xff\xff\xfe\x00\u007f\xf0\x01\xff\xff\xff\xfc\x00\u007f\xf8\x01\xff\xff\xff\xfc\x00\u007f\xf8\x00\xff\xff\xff\xf8\x00\xff\xf8\x00\xff\xff\xff\xfe\x00\xff\xfc\x00\u007f\xff\xff\xff\x80\xff\xfc\x00\u007f\xff\xff\xff\xf1\xff\xfc\x00?\xff\xff\xff\xfd\xff\xfe\x00\x1f\xff\xff\xff\xf8?\xfe\x00\x0f\xff\xff\xff\xf8\a\xff\x00\a\xff\xff\xfcp\x01\xff\x00\x03\xff\xff\xf8\x00\x00\xff\x80\x01\xff\xff\xe0\x00\x01\xff\xc0\x00\u007f\xff\xc0\x00\x03\xff\xc0\x00\x0f\xfe\x00\x00\xf3\xff\xe0\x00\x00\x00\x00\x01\xff\xff\xf0\x00\x00\x00\x00\x01\xff\xff\xf8\x00\x00\x00\x00\x03\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xfe\x00\x00\x00\x00\x1f\xff\xff\xff\x80\x00\x00\x00?\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\xf0\x00\x00\x01\xff\xff\xff\xff\xfc\x00\x00\x0f\xff\xff\xff\xff\xff\x80\x00?\xff\xff\xff\xff\xff\xfe\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff") func imagesFaviconIcoBytes() ([]byte, error) { return _imagesFaviconIco, nil } func imagesFaviconIco() (*asset, error) { bytes, err := imagesFaviconIcoBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/favicon.ico", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesFaviconPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \b\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\b\b\b\b|\bd\x88\x00\x00\x00\tpHYs\x00\x00\r\xd7\x00\x00\r\xd7\x01B(\x9bx\x00\x00\x00\x19tEXtSoftware\x00www.inkscape.org\x9b\xee<\x1a\x00\x00\x04\x01IDATX\x85\u0357oH]u\x18\xc7?\xcf\xef\xea\xd20u\xc1\xd6\x1bW\xde\u007f\x9a\x9b\xf3\u0726\xd0\xda\x1c\xccZE\xadb\x8c1b\xaf\x82\x05\u0562E\xb0\x17\t\xc1\xd8\xeaE\xf5\"\xa8hE%Q\xab7\xb2\xa0X[\xb4bJ\xb0aazo\x89\xa4\xdes5\xff\xb4\x8a\xa8\xad5Mw\xefyz\xa1W\xef_\xbdg\x06\xf6\xbc:\xe7\xf7\xfc\xf9~\xce\xe1y\xce\xefwDUYI3+\xaa\xfe\u007f\x00(r\x9b0\xec\xdb\u0610\x10\xcf]\x02\xb5\xaa\xd4\nT+\\D\xe4\x02\x0ea\xf1p\xcao\a\xbb\xd0\xf6D!\xf5\xa4\xd0\x1e\x88\xf9C\xcd\tG[E\xe4\xfe\x02\xc2\u007fV\xe5\xe8D\xf5\xea\xb6\xed\x1d\x1d\xf1e\x01\xf4\xd7\u05d7\xad\x9a,:\x01\xdc[\x10ijq\x18\xc0\xe8\x1e\u007f4\xd2wM\x00\xfd\xf5\xf5e\u0153E\x9f\v4\xbb\x15O\xb1\xcb*\xec\v\xda\xe1\xcf\\\x01,-\xae\xa3\x82\xfc\x800\xaep\x13P\x83\xb2>\x0fD\\\xc5\xdc\x17\xb4{\xbe\x1a_\xb7\xa5\xb4j\xec\xfc\u0522\x00\xe3\ubd94N\x15O\x9e\xc9#~\x12\x95W\x02\u00fd\x9d\x99\x8e\xa1\xea\xc6:1\x89\x03\xc0\x01\xb2'\xec\"B'\xca\x0e\xd0g\x02\xb1\u023by\x01\xa2~\xeb\tT\x8ee>\x05\xe8\xe3\x81X\xa4-\xcfS\xce[\xcc\x1fjv\x94\x0f\x81q\x85\x1e\x81\xa7\xd2\x02\x94\xf3\x81\xe1\xf0\xd6\xfc\x00\xdeP\x1f\u0086\xd4\x14\x15y0h\xf7\x9eZJ\xebQ\x90wR\x96t\xe6\xfax\xf9\xfa\xbe\xbe\xbf!\xe5\r\xd8\x01\xebN\xdb\x1fz/.\x15\xbf*\xf2\xbe\xa0\xcb\u0640fMD@\xd2\xc7Z%\x96\x14O\x03PG^U\xe5\x11\xa0\x1c@\x95\xfd\xd1\xe0F\xffr\xf4\xed[\xac]\xcc\xf6\xd0\x02\x13|\x9bzo\x16\x1c\xf2ZF~\xb1\u010b\x9e_\xc8t7\x86\x83\xbeM\x96\x1a2\xf7\x8d\x99\xb88G\u0480\x92=0\xe2\xf5\x96\u0125b\x14X\x93\xe2W\x84C(-\xc0\xed\b/b\xae\xbc\x11\x18\x1a\x9a^\\\xdc\xdaf\x90\x13\xc0\xda4\x87\xf0R\xc0\x0e?\x9b\x13\x00`\xc8\x17zN\xe0\xb0\xc0\x17\n\x95\xc0\xd6\xec\xf2:\xaaj\x0e\aG\xc2\x1f\xa0\xea\xa4z\x06|V\xad\as\bt? \x19\x89c\x93\x93Z\x97\xf9UM\x9f\x02\xd9\xeb\x19\xac\x89\xad\xae\x19\xe8\xfe}\xf6(\xe69\x03rG\xce\xc7\x14&P&\x04\xfd\xcb\x11\xb9,\x8e4 \x9a\xafg\xa6\x8d\xc8n\x9f\xdd{:\xab\xccbG\xb2\x98\xbf\xa9\xc2!~\x16eS\u07a0\xa5m\u0308\xd9\xed\xb3{\xbas9\x17m,\x9f\xdd})>}\xdd=\xc0\x97\xd7$\xad\x9c\xc5c\x1a\U000c90cbc\xf9\xa0\xcf\xdafD\x8e\xcc5\xe4b\xe6\b\x9c\x03\xda\xfd\xc35o.\xf5\u007fP0@\u04a2^k\xb3\x8a\xec0\xb0YUnE4\x01\u0328\xea\xa8\x11\xf3\t\xc6\xf9\xd4\x1f\x8d\xfcVh=\xd7\x00\xff\xb5\xad\xf8\xbf\xe1\x8a\x03\xfc\vB\x06\x9e\xfd\x06x\x8b\x9a\x00\x00\x00\x00IEND\xaeB`\x82") func imagesFaviconPngBytes() ([]byte, error) { return _imagesFaviconPng, nil } func imagesFaviconPng() (*asset, error) { bytes, err := imagesFaviconPngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/favicon.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesLogoOriginThinSvg = []byte(`logo-origin-thinCreated with Sketch.`) func imagesLogoOriginThinSvgBytes() ([]byte, error) { return _imagesLogoOriginThinSvg, nil } func imagesLogoOriginThinSvg() (*asset, error) { bytes, err := imagesLogoOriginThinSvgBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/logo-origin-thin.svg", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesLogoOriginPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x85\x00\x00\x007\b\x03\x00\x00\x00\x15\x06yp\x00\x00\x00cPLTE\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef.2\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xef.2\xff\xff\xff\xef.2\x02\xc6r0\x00\x00\x00\x1ftRNS\x00@\x80\xbf\x100\xef \u03df`\xdfP\x10\xafp\x8f\xef\xdf0\xbf`@\u03cf\x80 P\xafp\x9f\u007f\xf5\xa8\xf5\x00\x00\x03\xaaIDATx^\u0557kw\xab(\x14\x86_\xeex\x89\x9a6\xb7&\xed\xd9\xfd\xff\xbfrJ \xa1\ua32bg\xd9yV\xbeH\f}\xfa\xb2\xd9\"\x00\xc5k\t\x18\xf6\x05 \x99\x03\x86I\x80\xa9\u01d7\f\x80\x92\xf7\x0fcL\x85\x9b~\x92\x8a\x88\x1a\x03N_t`\xe4\x00'\x01\x90@\xab+\xd1\x00\x04@\xb0\xfb\xc7\n1(!H\b\xfc \x8cl\xdbQ\x05N\xac\xb5\xa4\x18\xf5.\vN\xd4;\v\xce\x01\x93Y\x84\b\b\x9e\xd6R\xa7\xb0\x88\xea\xc8\xce\xdd\u01a9\x05\xb4\x06'\x17\vcTq\x06g\xa1\r\t\u053a\x96\x00\x881f\xbdE\xcfd\xb2\xf0\xd15XBjr\x13\xceY\x18@\x90_\x11-\u0774\u070d\x0e$H\x00u\xa3k\x80\x84\x10\xfa\xb1\"jd\xc1\xc9\xc1\xb0@O\x0e\xbe\x90E\xe3\xb2\x10b0`\xc4\xfc(\xeb\xc8Y\x005\xa9bE\xfe\xab\x05\x8f\x16\x8bu\x11.+\u03b9\xb3\x90\x9a\x04\x94\x01\x1a6mQ\x93\x8fz\x01\xb3([\x11\x91\x95\xc9\xc2\xe1,\u0413\xc0\xa0+k\xe7\xaas \xd25fH\xb6=\xe6P\xbc\x95\x80\xf1\xa6e\xbfh\xf3~!C\x84\xf0\xf8;\x97\x91L\xe2\xff\xcc\xeet\xda\xe1[X\xcf97\b\x1d\xf79\r\x93\x8d\xa4\x84\r\x12\xa6\xe6\xdc\xc5<\xcf\xf5\xe3\xf0y\xe7\xf0qE\x8e\xe4:\x96|\xb1GLo\xe9\x8e\xe8G&,\xfe \xf6:O\xc7\xe6R\xb8|\x8e\xb8d\x89\u051ah\xcaBV4\x82\xcb\xef-\xa4\xa0\xc40\x99\xc7\xeb\xcbg\xc6\xfe\x15\x91\x81h\u0482i\xcah\xd4w\x16\xa6\xa11VNH\xec?\x9f9\xa6-7mQ\xd33Z\x95\x16\xd2RN\xb7 Q\xa6a\xf4\xb4\x05\xa3\x12\xad\n\v^\xb8\xd6(\xd9=\x96\xe3\xcf\xedt\xba\xfd\tJ/\xbb\xd0\xe2<\xcd\xc0y\x9b[\xc8 \xa8\xab\x96\xb1\xf6q\xa3}\xb6\x90\x0f\xbf\x8aw\xe4iP\xf2\xe6\x1d\xce\xd7 \x15\xf6\xca\x1b\x1c!\x8a\x1e\x9eh\x91\x04;\x19R\xb31\xb1\u0322\x1eU\x83\n\u2a8cb\xef%\u04bex\xf7\x1an@\u0155,,L\xf6UZ\u007f-s\x8b*\x8d\x02,\x99\xe6\x1c}\x1d\\\v\xaf\x8f\xf4+UZ\xa0\x1f\u035e\xd5P\x9d[\brT\xf0\xd8\xc2b\xfc\x9f_\xca5z\x8f\x16\rJ\v\x88r\xbe*\xfe\xc1\u00a2]x\xe4\xfb\xdai\xd1 c#\v\xfd\xb3\x16\xbbY\x8b\xbf\xbf\"\xbeI\xdd0\xe2\xe4\xbb\xe7\xbcE\x93\xef\xe1Tzb\x8d\xc5\xc5w\xefr\xe8}\u07a2#\xc7P\xee\xd4a\x8d\xc5\xcd\xc7\xff\x8a\xc8\xd5w\xad\xe3\xbcEM\xd9q<5\xdav\x8d\x05^\x9e:\xf8\xee\xec\xdb\xc5n\xdeB\xea\xf8|\xc8:x\x83U\x16\xc7\xf0\x10=\x85\xa28\u01e7\u0674E\x12\"\xcb\xc2\xfc\x8d\xbf\xaeWX\xf8\xfa\xf4\x9c\u07ce\u01f7\xf3\xe3\x02K\x16\xb0\u4c7c\xef\xf9\xe3B`\x85E8`\x14\xec\xaf\xcb\x16FS\x81\x95+,\u2c73x\x8d\xe1\xe9w\x8a9\x8a\t\xff\x1a!\x16\x86MaaM\xb0-C\xec[[\"\xf5\xf6a\xa4W\x14\xf5+*\xa3\u01f6x\v\x8eM1\xbf\u0082\xff\x86\x15\xa9i\xfb\xeaT\x1dy\u01069\bz\xc06\xec\x14\x91a\xe3\xdd\x11_\xd97\x0f\xa3\xff\x05\xadB(lKG\xd41l\x8dj%\xfe5\xff\x00O\xfe\u044d\x96\x10lF\x00\x00\x00\x00IEND\xaeB`\x82") func imagesLogoOriginPngBytes() ([]byte, error) { return _imagesLogoOriginPng, nil } func imagesLogoOriginPng() (*asset, error) { bytes, err := imagesLogoOriginPngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/logo-origin.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesLogoOriginSvg = []byte(``) func imagesLogoOriginSvgBytes() ([]byte, error) { return _imagesLogoOriginSvg, nil } func imagesLogoOriginSvg() (*asset, error) { bytes, err := imagesLogoOriginSvgBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/logo-origin.svg", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesMstile144x144Png = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x90\x00\x00\x00\x90\b\x06\x00\x00\x00\xe7F\xe2\xb8\x00\x00\x181IDATx\x9c\xed\x9di\x94\\gy\xe7\u007f\xef\xdd\xea\xde[K\xef\xea\u0586eY2\xb6d\x1bll\xb1\x18aCb \x0e\x03\xe4d3I\xe0\f9\xe4\fd\u0090\x8c\x0f\xc3\xcc8\x1e\x03\t$\xc0\x993\xf6\u0307$\x03!\tI\u0309cH\xe2\x13\x12\x0f\t6v\xf0\x86\xb7\x04\xe3M\xb6e\xad\xddR\xab\xbb\xba\xbb\xb6[u\x97\xf7\x9d\x0f\xd5-\xb7\xa4\xd6\xd2]o-\u077a\xbfs\xa4\x0f:W\xb7\u07ba\xf5\xbf\xef\xfa<\xffG\x00\x8a\x94\x94\x15bt\xbb\x01)\xab\x9bT@)-\x91\n(\xa5%R\x01\xa5\xb4D*\xa0\x94\x96H\x05\x94\xd2\x12\xa9\x80RZ\"\x15PJK\xa4\x02Ji\x89T@)-\x91\n(\xa5%R\x01\xa5\xb4D*\xa0\x94\x96H\x05\x94\xd2\x12\xa9\x80RZ\"\x15PJK\xa4\x02Ji\x89T@)-au\xbb\x01\xddD\xd0|\x83\x1ca\x905\f|a\xe0\bAF\x18\xc7\xdf,\xdf0\xb0\x10$(\xaaR\"\x81H)\xeaJRS\x92\xaa\x94\x84\xaa\xf9\xef\xe7cl\xf0y% \x01\f\x19\x16c\x96\xcdV;\u00e5\x8e\u01c5v\x86\xbca2dZ\f\x99\x16y\xc3\xc4\x12\xe2\xacb\x98Ibf\x92\x98\xe9$\xa6$\x13^\x89\x1b<\xdb\b\xd8\x175\x98\x88Cfer^\bJ\xb0\x86_\x1c\x01x\xc2`\u0532yc\xc6g\xb7\x97\xe72\xc7\xe3B\xc7m\xdbg*\xa5\xd8\x1b5x\xa6Q\xe3\x91z\x85\xa7\xeaU\x8e$\x11u\xb56\x1f\xf3\x9a\x14\x90/\f\xb6\xd8\x19v{9\xaeqs\\\x99\xf1\xe93\xad\xae|\xd1b\x12\xf3D\xbd\xc2#A\x85\x87\xeb\x15\x0eF!\xd1\x1az\xe4kJ@Ya\xf0v/\xcf\xcf\xe6\a\xb9*\xe3\x937L\f!\xba\xdd,\x00b\xa5\x98\x931\x0f\xd6\xca\xdcS\x99\xe1\xb1zuM\bi\xd5\v\xc8\x00\x86M\x8b]n\x8e_\xcc\x0f\xf1V/\a\xf4\xf6\x97RJ\xf1\xfd\xa0\xc4_\x96\xa6y\xa6Q\xa3(\x93n7i\u016cj\x01\xad7m\u079b\xed\xe3\xfd\xb9\x01\xb6;.\x19\xb1\xbav%\xeaR\xf2lX\xe3\xeer\x91\xfb\x832\xd3I\xdc\xed&-\x9bU) W\b~:\xdb\u03ef\xf6\x8dp\xb1\xe3u\xbb9-\x13+\xc53\x8d\x1a\xffwn\x92\aj\xe5U5\xb4\xad:\x01]\x95\xf1\xf9X\xdf\b7d\xfb\xbb\xdd\x14\xed\xc4J\xf1w\x95\x19\xfe\xac4\xc5\xf3a\xd0\xed\xe6\x9c\x13\xabF@\x9e\x10\xfcR~\x98O\xf4\xaf\xa3\xcf\\\xbb\xdbW\x02\x18\x8fC\xfegq\x82{\xaa\xb3=\xff\xe3\xac\n\x01m\xb12|zp\x8cw\xaf\xc1^\xe7t\b\xe0\xce\xd2\x14w\xcc\x1e\xed\xe9\xb9Q\xcf\v\u89f3\xfd|\xaa\u007f\xb4\xad\x9b\u007f\xbd\xcc\x0f\x83\nw\xcc\x1e\xe1\x87\xf5j\xb7\x9b\xb2$=+ G\b>\u07b7\x8e_\xef\x1f\xc5\uc47d\x9cn1\x9b\xc4|\xa98\u03b7+3\xc8n7\xe6$zR@}\x86\xc9\xcd\x03c\xfcR~\bu\x9e\x8bg\x81PJn\x9f=\u029f\xccM\xd2K\x03Z\xcf\th\u0130\xf8\xec\xf0F\xde\xe3\xf7\xa5\xe29\x89H)\xfe\xbct\x8c\xdbg\x8e\x12\xa8\xde\xe8\x8bL\xe0\xb3\xddn\xc4\x02#\xa6\xc5\xe7\x8775'\u02e9xN\xc1\x14\x82+3>9\xd3\xe4\xf1\x1e9\n\xe9\x99\x1eh\x8b\xe5\xf0\x85\xe1\u037c\xd9\xcb\xf5F\x83z\x18\xa5\x14wW\x8a|\xa98\xc1\\\x97\x8fAzb\xef\xbf`\x18|~x\x13\xbb\xdcl*\x9es@\b\xc1\xcf\xe5\x06\xf9\u03411\x1c\xba\xdbSw}G\xceA\xf0\xb9\xa1M\xbc\xcd\xcbw]<\x02\b\x95\xa2&\x13jJ\x12+u\xbcM&\x02G4\xffx\xc2\xc01\xba\xfb\xee\t!\xb8)?\xc4x\x1c\xf2\u0579c]kGW\x05d\x027\x0f\x8eqc\xb6\xbf\xe3\xe2Yxo\xab2\xe1\u0170\xcesa3\x9a\xb0(c\xa6\xe3\x98i\x19S\x97\xea\xf8 o\x88f\xb8H\xde0\xe93M\xc6L\x9b\xad\xb6\xcb\xe5\x19\x8fm\xb6\x8bk\x18\x1d\xff\x0e\x96\x10\xfcV\xff\x1832\xe6\xee\xf2\xcc\x19\xaf\x1d0,L!\x98J\"\xbdm\xd0z\xb7e\xf2\xc1\xdc 7\xe5\x870\xcf!\x84T\x17\xb1R\xcc\u0298\xa7\xeaU\xbeW+\xf1X\xbdJY\xc6T\xe6\u3757\x83\td\xe7\xc3a\xaf\xced\xb9\xde\xcfs\xb5\x9b\xa3\xcf0;\xb6we\x1b\x06\x9f\x1e\xd8\xc0\xcba\x83\u007fm\u050e\xff\xbb\x00,\x04\x17;>\xd7f\a\xb96;D\x03\xc1\xff8\xf2\x1cG\u21b6\xcf\xef\xda$z\x97\x9b\u5391\v\x18\xb1\xec\x8e4@)\u0143A\x99\u007f\xa8\xce\xf2\xc3z\x95\x898D\xf7\xf4\xd3F\xb0\xd1rx\x8b\x97\xe5\xdd~?\xef\xf0;7,?]\xaf\xf2\x1b\x93\xfb\x98Lb\xaet\xf3l\xcb\xe4\xd8\xe5\x0f\xb0\xc9\xc9\xe2\x1a6\x92\xe6\x8f}_\xf9(\u007f8\xb5\x97XS\u02fa\"\xa01\xd3\xe6\x0fF\xb7pY\xc6\xef\xc8\xe7=\x10\x94\xf8\xd2\xf4\x04\xfb\xe3\x06a\x87b\x933Bp\xb1\xe3\xf2\xb9\xa1M\\\x91\xf1\xdb\xf6\x90\x17\xfa\xb9(\x91|\xafQ#1}\xd6\xd9>\x960\x96\x8c\xc6TJ\xf1\x95\xc9\x17x\xacv\xe6!o9\x9f\xdfQ\x01e\x84\xe0\xbf\f\xac\xe7#}#m\xfd\xf0D)^\b\x03\xbe:w\x8c\xefTg\xdb\xf4)\xe7\xc6M\xf9A>\u05b7\x8e\v\uc316\xfb\t@*EC)\x02\f\x0e'\x92\x9a\x91\xc15\x1d\x14,\xb9.k\x0ei\x92\x8cR\xfc(\x98\xe1\xb7'_\xa2\xa1\xe1e\uae00v{y\xbe2\xbc\x99!\xcbn\xdbgL'\x11_\x9f\x9b\xe2\xae\xf24\xb3=\x12.:jZ|\xb40\xc2M\x85!r\x86\xb9\xec\x87.\x94B\x02!\x8a\xaa\x12\x14\x95A\x19\x1b%,L\x01\bq\\8j\xfeo\x13\x81\x85\xc2Q\x92\f\x12\x13\xd5\xfc\xc1\x95\xe2\xb6c\xafr_\xad\xd8\xf2\xf7\uaa00\xfa\f\x93\xdbG^\xc7n\xbf\u0416\x0f\x95J\xf1d\xbd\xca\x17\x8b\xe3\xfc\xb8G\x03\xb2\xde\xe9\x15\xf8\xef\x83\xeb\xd9r\xae\xd1\x05J!QT\x94AQ\tj\u00a6\xa2\f\x1c\xd3B\xcc\v\x02^\xfb\x11\r\x14\x16\xe0 q\x94\u0119\xbf\xe6\xe4\x05\xc2\v\x8d\n\x9f<\xb2\x87z\x8bG\"\x1d=\xca\xf8\x95\xfc0\x1f*\f\xb5\xe5\x98B)\xc57JS|v\xfa0\a\xe2P\xfb\xfdu\xb1/n\xf0\x83\xa0\u00a8e\xb1\xed,\"\xda\x1b\xd6\xf9Nu\x16i\xe5)\x1b>Ua\x93\b\x13\xdbx-sV\xd1\xdc\r\xb6\x91\xb8*!\x87\xc4'\xc1\x99\x17\x92b\xe9\x1eb\xd8r\xd8\x17\x05\xec\x8dZ{\xd1:\xb6\x8c\xdfb9\xfcra\b\xa3\rK\xf6XI~oz\x9co\x94\xa75\u07f9=\xbc\x1a7\xf8\xad\xc9\x03\xdc:\x94\xf0\xa1\xc2\xd0)\xcf\u3260\xc2\u0755\"\x0f\x05\x15\x8e$\x11\xaf\xaf\x96\xb8e\xf4\x12\xb2\xa6s\xfc\x1aE\xf3\xc7\xf3T\x82\x8d\xc4Z\xd4\x1b-\xbe\xe6t\x1c\xd5\xf4\x92uL@?\x97\x1fd\xa3\xe5h\x17OE&|\xb98\xce7\u02ed\x8f\xe7\x9d$Dq\xeb\xf4!*2\xe1\xa6\xc2\x10\x87\xe2\x90'\xeaU\xbe].\xf2|X?a\x99\xfdb\xa3\u009f\x17\x0f\U0003186d8\x86\xd1\xecm\x90d\x949\xb9O\xd3\xddV\x1f\x06\xb0\xa7Q\xe1\u0570\x84B\xf1\xbbS\x87\xd9\x13\x9e}\bl\x17m\x15\xd0\x0e\xc7\xe3\x12\xc7\xd5\"\x1e\x014\xa4\xe4\xf7\x8b\xe3\x1c\xed\xe1<\xa9v\xd1o\x18\\d;\\\xefe\xb9\xce\xcfr\xa9-\x19\x8fC\xa4\xd2\x1b\x9e\xb1\\\xda*\xa0\xdd^\x9e\xbcij\xb9\x97\x00\xbe\x1f\x94\xf8\u007f\xb59-\xf7[\rxB\xb0\u07b2\xd8\xed\xfa\u0718\u0371\xcb\xf5\xc9-\x8a;\xf2\x8c\f\xef\xf1\xf3\xbc<\u05fd\x85D\xdb\x044bZ\u0710\xed\xd3v\xbf\xd9$\xe6\xcb\xc5\tm\xf7\xebUl`\x83es\x8d\xeb\xf2./\u02d5\x19\x8f\x8bl\xfb\xf8\xee\xfd\xe2\xde<#\f~*\x9b\xe5\xae\xca\x1c\u01d2\xee\x9c\xf9\xb5M@;\x1c\x8f-vF\xdb\xf0\xf5\x8d\xf24\xfb{\xf8\x88\xa2U\xfa\f\x83\u02dd\f\xef\xcb\x16\xb8\xd6\xf3\xd8b\xd98B \xcep\uc8c0\xcb\x1c\x97\xb7\xba\x1e\xf7T+\x9dk\xec\"\xda\" \x1b\xc1\a5.\xdd'\xe2\x90o\xad\xf2\xfd\x9e\x931\x81\xbcap\xb1\xed\xf06\xcf\xe7\xea\x8c\xc7[\\\x8f>sy'\xf5Y\xc3\xe0]^\x96{\xabU\xc2.\xc4\x06\xb6E@Y\xc3\xe0MnV\u02fd\f\xe0\x91\xa0\xc2\xc4\x1a\xea}2B\xf0\xe1|\x1f7\xf89.u\x1cFL\xebx\b\xecJ$\xf0v\xcfg\xb3m\xf1J\xd4\xf9\tu[R\v.\x9f\xf7'\xd4\xf1>(\xa5\xf8\xebrQ{\xf8i7Q\n\xae\u02b8\xbc\xcb\xcf2f\xd9-\xc5O+\x9a\xf3\xcd+\xbad>\xd1\x16\x01\xbd\xdeq\xc9i\xb0\x9b\x13\xc0\x93\x8d\xda\t\xc1\xe2k\x81\x10\u015f\x96\xe6\xa8J=\xe9\u025e\x10\xbc\xd3\xd7\xd3\xe3/\x17\xed\x022\x81\u0356s\xc6\xc9\xdfr\xf8V\xb9\xd8\x13)\xbc\xba\xf9a#\xe0\xe9F]\xcf\x0f \x04;\x9c\f\x83\x86\x9e-\x93\xe5\xa0]@\x05\xc3\xe4R\xc7\xd3\xf2\x93\xcf&1\xff\xb6\xc6z\x9f\xc5|f\uaa36Wc\x8besEFO\xcc\xf5r\xd0. \xdf0\xd8d\xe9\t\xdbx6\f\xd8\x1b\xe9\xcba\xea5\xf6D!\x0f\xd6\xf4\x18G\xf5\x9b&;\xba0\x0f\xd2.\xa0>\xc3\xc2\u05d0\xf6\xab\x94\xe2\xe5\x93\x02\xab\xd6\"wUJZ\xb2\xdb\x15\xb0\xd3\xc9\xe0v\xd8\xd5D\xbb\x80\xb6\xd8\x0e\x8e\x86/\x11\xa1x.\f\u05b8|\xe0\xa9F]\x9b\a\xe2\x0e\u01e1\xbf\xc3\xf3 \xed\x02\xdad9-\x1b~\v\x9a!\x98\aO\xb3\xf7\x935LF-\xa77\xacEZd_\x14q,I\xb4|\x97\x8d\x96M\u007f\x87M\x1f\xb4n$\n`\u0430\xb4\xf8\xf8\x05R\x1e\xf7\xbe1\x80\x8c0\xd9\xe9\xe6\xb9\xcc-\xb0\xd3\xeb\xe3\xd5F\x85\xaf\x15\xf7u,\u04f4]D(\xbe_\xabr\xa9\xd3\xda\x04X\xd1\xdc\xc0\xddh\u067c\x10\x9d~\xd35#\x04 hhr8\xd3.\xa0\xbcabpj\x1e\xd2rP\xc0T\x12Q\x8c#\xde\xe4\xf5\xb1\xd3-\xb0\xc3-\xb0\xc9\u0392\x99\xaf\xe75\x11\xd5{\xc4\x1a\xabu\x1e\xae\a|BCxzF\b6[\u0592w\x1a4L\xaer\v\xbc#;\xc0\x9e0\xe0/\xe6\xf4\x1cLk\x17\x90o,'\xe4{\xe9{\xa0\x14\x91a\xf3_\xc7v\xb0\xc1\xf6\xb1\x85q\u00beR\xa2\x14\xa1Z;\x05\xdd\xf6\xc7\x11\x91\x92\xe7T\xe8\xeeLH\x9a\x85g\x16\v\xc8\x13\x06\xbf>\xb0\x917x}\xac\xb3\x1c\fa\x10(}\xa1\xc0\xda\xcf\xc2\x1c!\x96\xd5\x03-\xe4yG\nJ\bf\xe6Sv-\xdbf\u02e2\u01e9\x16]o\xa2Pk\xa8\"\xe0D\x1cq8\x8e\xb8\xa0\u016c\x15\x03(\x98\x82\xf5\x96\u00ceL\x8e\x9f\xcc\r\xf0\x06\xb7\x80)\xcc\x13\x9e\x9f\xd2\xf8\xe4\xb4\xf7@&\xe7\xf6\x16\x99@C%\u0514\u02442\xa8\v\a%L\fC\xcc7\uad7bH\xc0B\x91A\xe2)\x89P\x12\xa1\x12\xad\x0f\xa2\x9b\xccH\xc9T\x92p\xc1\nC\xc7-\xa0,%\x812y\x93\xbf\x8e\xff\xe5m\xa0\xdf\\:\x86H7\x9a\x05$\u03ba\x9a\x90J\x11*\u01444\xa8\x19.\x01\x16\x96\xd9L\xd5=y\xf1/h\xa6\xecz(\x1c\x95`\xc2\xf1\xe2\xb6\xfd\xa6\x859_\fw-0\x99,s\xc7k\xdel\xa1\xa4\x14\xd3\u02a6\x84K\x8c\x85i\n\xceV\x10B\xe7N\x91V\x01)\x96\x1e\xba\x04M+\xb9g\xc3:\x86\x95\xc51=b\xb3\xe9_\xe3\x9c\xf4\xff\x9b\x8dRxJ\xe2,J\xd9]|o\x01\xf4\x1b\x16\x96\x10\xab~\x15\xb6\xc0\xac\x94g\x9dF/\f\xf7U\x05G\xa4Id\xd8\u0515\x85D`\b\xc1\xb9v`:\x1d\xa65\vH\x1dw{PJ\x11)\u0151$\xe2\aA\x99\xff3{\x94\xba\x82[G/a\xbber\xf2v\x97\x81\xc2F\x91%\xc1\x99\u007f\xbb^\xbb\xefI\b\xc1\x809\x1f\x06\xb16\xf4\xd3\xf4c<\rR)\x02\xa5h`\xb2WZ(\xe1a\x1aMA\t\xc1)\xcf\xf2l(\x8d/\x9d\xf6ItI&\x1c\x8aB\x1e\xadW\xf8AP\xe6_\x82\xf2\xf1\xfd\x1cW\x18LDu\xb6\xb9\x05`\xc1\x8aD\x91A\x91Q\x12\x9b\xa6p\xce\xf6\x86D\xf3\x0e\xaaF\x97-nur\xb2\u034aT\x8a\x19\x99\xb0?\x8ax(\xa8\xf1\xe3(\xe6\x17\x06\xb6\xd0g\xda,\xc7\x14\xf05\u06d7\x85y$Lk\xf4H\xd4>\x84}\xb3T\xe4ks\xc78\x9aD\xa78`\u0555d2\xaec\xa9\x04W@\x06\x895o\xa5+\xe0\x8cAc\x02(%1/\x865\x1e\r\xe6\xf8\xd7z\x85\x8a\\;\xe9=\xbe\xd1|\x1d\xeaJ\xf2|\xa3\xc1\x03A\x8d\xfb\x83*\u03c6\r*R\xf2F\xb7@V4\r\xa3\u0385\x85\xab\xecy\xd1\xf8H\\\xd1|Y\x0fF\xfa\"\x1c\xb4\nH\x02\u03df\xc5o&HBr2&c\x9c\xb8B8\xddc\x99Kb\x8e%!\x8f\a%\x1e\xae\xcd\xf1|\xa3Bc\xad\x8c[\x8b(I\u025d\xe59\xee\xadVx\xb4^\xa3xR\xb0\u0665\x99\xecY\x8f\x88\x16^D\x03p\x85\xc2[X\x80,\x9aG6\xabG\xeb\x8b\xef\xec\xb8\xcd\xefD\\'P1\xce\x19\xa6|R)\x0e\xc7\r\x1e\xa9\xcd\xf2hP\u2570Fq\r\xf56Kq\xc7\xec45)Y*\xaaY\x00C\xa6\xbdd\x90\u0782\x81\x94\t\xf8(<\xd1\x14\x8dEs\x8a\xb0\xf8\x1ah\x1a\xa9\x175\xa6\x00uA@!\xc5$\xa6\xdfW\xbb^\xf3\xack\xd1\xe1\u07b0i\xa5\x02:\a\u0798\xc9r\x89\xad'\xcb%P\x92\x97B\xbdvw\xda\x04T0\f\xb6Z6\xbb\\\x8fk\xbd,\x97;\x196\xdbg\xde3\xfd\t\xcf\xe7\xbeZe\u0265k\u02bc\xb1f~\xb0\xe5\x9e\a\x9a=\u064c\x8c9\xd2K\xe5\x9el`\xb3es\xbd\x9f\xe5:\xcf\u728c\u02f0i\x1e\xdf\xf0:\u04d7V\xc05\xaeG\xbfiv\u035a\xa4\xd7\x19\xb5l\xde\xe6\xea+\x01z\u007f\xad\u010cfs\xae\x15\th\xc00\xb9\xc6u\xf9@6\xcf5\xae\xc7\xe6\x15\xe6w_d;\xbc1\xe3\xf2O\x9ar\xa3\xd6\x1a?\xe5\xf7\xb3^\x93\xbf\xa4\x00\x9e\xac\u05f4\u05dd_\x91\x80n\xca\x17\xf8o\x03\u00f8-f\x00x\x86\xc1\xbf\xcb\xe6S\x01-\xc1\x06\xd3\xe6\x17\xf3\x83\u069c\xfd_\n\x1b<\xdd\xd0\xff\x9cW\xa4\x80\x97\xc2\x10OG\xf2 \xf0\xfel\x9e\x9d-f$\xac5\x04\xf0\u02c5!.\xd2\xe8/\xf9\x83\xa0\xc4d\x1b\xbc%W\xa4\x82\x17\xa3\x86\xb6\xf3\x14\xdf0\xf8p\xbeoM\xe4x\xe9\u228c\xcf\xcf\u71f4\r7\x15\x99\xf0\xbdZI\xd3\xddNdE\xbf\xdbT\x92\xb0Gc\xce\xfa\xfb\xb2y\xb6k,\x83\xb0\x9aq\x85\xe0\x13}\xeb\x184\xf5,\x90\x05\xf0RX\xe7\xa56\xb9\u056fH@u\xa5\xb8\xafV\xd5\x16\xce5jY|\xb4p\xb6H\xde\xf3\x83\x9f\xcf\r\xf1\x13\xd9>mC\x97\x00\x1e\n\xca\xdaW_\v\xacH@\n\xf8^P#\u0434%\xae\x80\x0f\xe5\xfb\xb8\xe2<\x9f\v\xdd\xe0\x15\xb8mx\xa3\xd6{\x16\x93\x98\xfb\x82r\xdb\x1c\xdeV<\xf5x\xaeQ\u747a\xbe^\xc87\f\xfell#\xd9\x0e\xbbK\xf4\n[\xec\f\xb7\x0em\xd4\x1e*\xf7PP\xe6\x85F\xfb\xaa7\xaeX@1pW\xb9\xac\xad!\n\xd8d\xd9\xdc:8r\u038dZ\x88\xbe[\ud3196\xb7\x8f\xbc\x8e\xf5\x9a\xe7\x81U\x99pgy\xba\xad\xee\xad-=\xff\ajU\x9em\u0535\xf5B\n\xf8\x95B\x1f7\xe5\vg\xbc\xce\x04.\xb2=n\x1ez\x1d_\\\xb7\x8d\r\x9a\f\xad\xba\xc1F\xcb\xe6\x8fF\xb7\xb0Ss\tt\x01|\xb7:\xc7S\xf5\xf6:\xbc\xb54\u055f\x92\t\u07e9V\u0619\xd1\u7315\x11\x06\xb7\f\x8c\xf0B\x18\xf2T\u3d55\x83\x89\xc07\f\xde\xea\xf5q\xad?\xc0\xee\xec\x00\x11\xcd7\xe06\xd3\xe6\x96\u0257\x99\xd2|\xce\xd3n\x86\f\x8b;F.`\x87f\xf1\x00\x94e\xc2\u0755b\xdb\r\xbaZ\xb6\x84x\xbd\xed\xf0\xed\xf5\x9b\x19\xb1\xf4\x1d\xec\v\xe0\xf9F\x9d_\x9b\x9c\xa0\xac`\xbb\xe3\xb3\xdb\x1f`\x8b\xe3\xb3\xc5\xf1\x8eG\xdf-\x181 \x04\a\u00c0\xff=\xbd\x9f\u007fkt\u01f1}\xb9\\\xe7\xe5\xf9\xcc\xe0\x06\xb6\xb7\u0256\xee/JS|~\xfap\xdb\xd3\x0fZ\x16\x90\x01\xdc28\xc2'\xfb\a\xb54\xc8FQJ\x14u\xc3\u2c7a$\x11V\xb3\xb8\u06a2\xba\xe8K!\x80R\x1c\xf1\u0559\x03\xdc[\x9d\xd1\u0496v\xf1\x91\xfc\x10\x9f\x1a\x18\xa3\xa0i\xaf\xe7d^\t\xeb|\xe4\xc8+m\xd9y>\x19-5S7\x98\x16\xdf\u07b0\x99\xad+\x98\x04.\xecU4\x94\xa2\x8e\u0a34\b\x94EC\x98X+q:S\x92\u007f*\x1f\xe5\u03b9I\x0e\xf7\u0610\xb6\xcd\xce\xf0\xc9\xfeQ\u079b\xed\xc7h\xd3j\xb3!%7\x1f;\u0431\xaaFZ\xea\u0197\x95$R\xf0n?\xbb\xac\x9a\xf0\x16\x8aY\t\x87\x13\x87\t\x95\xa1H\x86:6\x18\xe6\x8a\x1e\xb0\x04\f!\xd8\xe5fy\xaf\x9fc2\x8ey\xb9G\\^?Z\x18\xe6s\u00db\xb9\xd2\xcdj\xf3\xd0>\x19\x01\xfccu\x96\xaf\x97\xa6:fN\xaa\xadj\xf3\x90a\xf2\x8d\xb1\r\xecr\xfd3\xdep!\xcf;\xc0\xe0@\x92A\x19\x0e\x06\xaa\xa5\x87\xdat\xf1P\x14\x90\xe4\xc5k&\x05\x02x\xb0V\xe2\v\xc5q\xf6E\x8d\x8e\x97K\xb0\x11\xbc\xc1\xf5\xf9\u0761Ml\x9f?\x18m\xe7\xcfz4\x8e\xf8\u0211W:j\x8d\xac\xb5\xec\xf7\a\xb2y\xfe`\xddz\xec%B\x10B%y)\f\xb9/\xa8\xf2\u03f5*o\xf6G\xb8\xb10\xba\xa2\x8f_Ho\xb1Q\xf8\xf3\u0657\xaeP\xa75\xb6\xaa\u0204\u007f\xa8\xccrOu\x86g\x1a\x81\u05ac\x84\xa5\x184,\xde\xe2e\xb91\xdb\xcf\r~_\u06c6\xab\xc5$Jq\xeb\xd4!\xfe\xba\xd2\u066aFZ\x05d\x02\xb7\x8f\x8c\xf1\xa1|_\xd3$A)\xc6\xe3\x98\xfb\x83*\u07e9\x96y\xa2Q\xa7\"\xe5\xbca\x94\xe0\u02e3\u06f8\xcc;\xf7\xa2t\v\x19\x989\x12|\x01\x1e\x12\x83s\x0f6\x8f\x94\xe4\u01cd\x80\xbf\xad\xcc\xf0`Pf:\x89\t4\x89)+\f^g;\xdc\xe0\xf7\xf1\xfe\xfc\x00\x1bM\a\xabC\xbb\xeaJ)\xfex\xee\x18_\x99\x99\xd0\x1e0v6\xb4\n\b`\x93e\xf1\xd5u\x1b8\x96\xc4<\x10\u0538\xa7Z>m\xc8\xea&\xcb\xe1\xf3\ubdb1\xd99\xfd\xb0\xb7\xb0\xdb\xec \u0262\xf0\x85<%\xbde%Td\xc2\xe3\xf5\n\x8f\u05eb\xec\x8d\x1a\x1c\x8cC\x8e\xc6\x11\x91R\xc4(\xa4R\u01c7\xbc\x85\x89\xbe\x81\xc0\x14M\xf1;\xc2`\x93es\xa1\x9da\xab\xe3\xf2\x0e/\xcfN\xc7k\xdb\xfc\xe6t,\x1c\x96~jr?\xb3]\xc8\xe4\xd5. \x01\xac3Mf\xa5<\u015dc)\xaeqs|fx+\x85\x93v\x93\x17\xe65y\xd1\x1c\xa6\x16\x8c\xa6\xd0\xdd` \x90\t\xb32\xa1\"\x13\xa6\x93\x84\x898d2\x89\x98N\x12\x12\x14\x8e\x10XB0hXl\xb4m6\x98M/\xec~\xc3dpQ\xad\xafn\xf0l\xa3\xc6\u007f\x9a\xdc\u03c1.\xd5S\xd3.\xa0\x95\xf0\xbe\xdc \x1f\x1f\xbc\x80\x8c\xd14\x9e\xf2\xe6{\x1bOHL\x96\x97yy>q j\xf0\x9b\x93\xfby&l\xdfa\xe9\xd9\xe8xj\xf3R\xfc}\xa5H\u07b0\xf9D\xff(#\x86\x81=?!NH\xc5s:&\xe2\x90/\x16\u01fb*\x1e\xe8\x91\x1eh\x81\x9f\xc9\xf5s\xdb\xd0\xe6\x13J[\xa7\x9c\u02918\u45a9C<\x18\u82c6X)Z6\x12u\xf1BX\xe7H\x12q\x8d\x9b\xd5\x12\xb4\xbf\xd6\x10\xc0\xc1\xa8\xc1oO\x1d\xe2_\xea\xbdq\xe6\xd7S=\xd0\x02\xef\xf6\xfb\xf8\xec\xd0&\xd6Y\xe7j\xe8\xb6\xf6\x11\xc0\x9e0\xe0\x96\xa9C<\xddCE\xf8zR@\x00\xbb\xdc,_\x1a\xde\xcc&\xfb\xfc\x0es\x05@)\x9en\xd4\xf8\xf4\xb1\x03\xec\xef\xb1\xea\xd5=+ \x80K\x1c\x97\xff<0\u01bb|=A\u6ad1PI\xbeU\x9e\xe1\x8f\xe6\x8er8\xee\xad\xc3a\xe8q\x01A\xd3\xe9\xe3?\xf4\xad\xe37\xfaGAS\x96\xe6j`\xc1\x9c\xfd\v\xc5q\xfe\xa6<\u04f3\x85\x87{^@\v\xdc\xe0\x17\xb8mh#c\x96\xb3:\x1a\xdc\x02\x02x\xba^\xe3w\x8a\x87\xf8Q\x1b\x03\xe2u\xb0j\x04\x04\xcdr\xe27\x0f\x8c\xf1\x9el\u007f\xc7\u0399:MY&|\xb34\u015f\xccM1\xb5\n\x9ciW\x95\x80\xa0Y\xff\xeam^\x8e\xff\xd8?\xcaN\xc7\xeb\xc8Iw'\x88\x95\xe2\xe1\xa0\xcc\x1f\xceM\xf2d\xbd\xda\xf1C\u0455\xb2\xea\x04\xb4\xc0\x88i\xf1\x81\xdc\x00\x1f\xcc\r\xb0\xcdv\xbbz\x1e\xd5\n\r)\xf9Q\xa3\xc6\u0755\"\u07ed\xceQis\xa8\x89nV\xad\x80\xa0\xd9\xf8\xf5\x96\xcdu^\x9e\x0f\x17F\xb8X\x93\x9bE'\x10\xc0cA\x95?-5{\x9c\xe2*\xf5\xc4^\xd5\x02Z\u0308i\xf1\xbe\xec\x007\xe5\aYo9\xf8=z\x1cR\x91\t\xcf7\x02\xee,O\xf3\xdd\xea\\[\x93\xfe:\xc1\x9a\x11\xd0\x02#\xa6\xc5U\x99,\xd7\xf9\x05v{9\xc6,\xa7\xab_R\xd0\f\xf8z>\fx\xb8^\u17eb%^\x8c\x02\xca\x1a\u037e\xbb\u025a\x13\xd0\x02\x16\x82uVSL?\xe9\x17x\xb3\x9bc\xc4ZN\xa1\xa4\u0588\x95boT\xe7\u0460\xc2wks\xbc\x146\x98\x95\xf1\xaa\x99\x1c\x9f+kV@\x8b\x11\xc0\xa8i\xb3\xd5\xcep\x8d\x9b\xe5\xf2\x8c\u03f0i\xb1\xc9r\xe87\xf5\x9c\xb7\x8dG!\x87\xe3\x90Cq\u0213\xf5*\u03c5\x01\xfb\xe3p\xcd\xd7\xfb8/\x04\xb4\x98fa`\xc8\x1a&}\x86IV\x18\f\x9b6\x97d\\.\xb6].r\\\x86M\x9b\x11\xd3\xc6^\\\x10Q)\xaaJ2\x19G\x1c\x8c#\x0eDu\xf6D\r^\x89\xea\xcc&\t%\x990'\x13\x1aJ\xae\xb9^\xe6L\x9cw\x02J\xd1K\x1at\x93\xd2\x12\xa9\x80RZ\"\x15PJK\xa4\x02Ji\x89T@)-\x91\n(\xa5%R\x01\xa5\xb4D*\xa0\x94\x96H\x05\x94\xd2\x12\xa9\x80RZ\"\x15PJK\xa4\x02Ji\x89T@)-\x91\n(\xa5%R\x01\xa5\xb4D*\xa0\x94\x96H\x05\x94\xd2\x12\xa9\x80RZ\xe2\xff\x03\xc7d\x8eC\x1cl\xc2\x00\x00\x00\x00\x00IEND\xaeB`\x82") func imagesMstile144x144PngBytes() ([]byte, error) { return _imagesMstile144x144Png, nil } func imagesMstile144x144Png() (*asset, error) { bytes, err := imagesMstile144x144PngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/mstile-144x144.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesOpenshiftLogoSvg = []byte(``) func imagesOpenshiftLogoSvgBytes() ([]byte, error) { return _imagesOpenshiftLogoSvg, nil } func imagesOpenshiftLogoSvg() (*asset, error) { bytes, err := imagesOpenshiftLogoSvgBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/openshift-logo.svg", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesOpenshiftLogo222Png = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xde\x00\x00\x00'\b\x06\x00\x00\x00`\xfa\xf6f\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xc9e<\x00\x00\b=IDATx\xda\xec]\xbfo\xdbF\x14~\x92\xa8\u0108\u0748\x19:5\x8dU\xa0\b\x90v\x88\f\xb4\xb3i\xa0\xbb\u0569\xa3\xe9\xb1S\u073f\xc0\xcc_\x10e\xea\x18\xea/\xa8\xafi\xc2\xe4\xf3\x14\x1eL^g1S\xb4)O9hI^\x1b\xf5\x9e\x9fj\u0279\x89\xc6\u0242\xe8$\x91\xad0F>\xd3\xc4k\x81x\xef\xca&\xde(\xd7/>\x93\xfao\xc5,4?\xe5\xf3{0\xd9\xf0\x0f\xa3\x16\x93X\xf0f\x18\x9bTA\xfe\xc4LZ)\xd7\xc39\x97U\x12\xab\x8c!\xf2q\\ya\xc8\x1as\xddYU\fj\xa4\xa6\x84\xec8\xb6p\xf14\x89\n\xd2\u0744\xf87\x1e\xb2x\x9e&$\u007fe?\xcd&\xfaiD\x1b\xe4\xdf6\xf1\x18\xefe\xe2\x9ax\x05\x1fN\x9ePOHC\x95G\xf8{\x93\xe3\xf94\xc2\xc4\xc3m\x04?\xe2\x9a\x1a!\xc8=\x9a\xee'\xe5\x0e)t\xc0;\xe1\xf4\u007f\n\u04adJX\\?\xee#J\x92\xe4\xb3@\xees\x16\x94\xe4K\xa0\xee\xed\xf3\x93\x0e\a\xe4\xde\xfd\xeb\xe1\xb880\xd9\xd61q\\\x1d4TU\xc6#Z\xda\xdb\xc5K\xcd \x1e:f\xfd\xfa\xa3C\xd8\x1d\x0e\xe1\u0570os,\x98\xd7\xfe\xf4\vg\xf9\xaf\x87J>v\x14\x11\u00e8\xb2\xee\x9f\x01\xff#=>L>\xd2\x13G8?\x87\xd8/K}~\xc6\xf6\x05\x92\xb3\x1eQ'\x8b\xdbXx\xe3\x18|\x06\"\xcePz)\xfa\xec0\xf7\x8aT\x99\x17\xd1v\x0f\xf2\x89\xd9\xfd\x90\x04\x97F\x81!\xc4#\xc6ju\x9f\x1e\xecu\xdf\x1c\x0e\xb9\xb1F\xb0\xdfF7\xb8\u02c5\"\ud52b\xf2\xf3~\x88\x16\xa9\xf3[m\x1b5\xce\"X\xe2-\a\xc9\b\xfa!\"\x94\x92^\xa0\xd9\xc7\a\xa4\x8b\xa51\xe1\xe6\x8a%\x91T\xf3\x80\xffA[\v\x92\x9d\xb7\xd3\u007fGA\xe3|\x10\x8f\x87_\xae}\xb9L=\xda\xc2\xf8\xf8\x961\xad6\xe9O\xb8k\x9co\xe21I\x10\x17\xa6s\nA\x93NC\x13\x8f!\x9f\xfe3]\x1a\x1a\xd3&\x1e\x92O\xffaJ\r\x8di\x13\x8f!\xa0\xea?\xc5l+\xf8\x86\xa6\x86\xc6\xd9&^\x88\x806$?\xa1@\xe3\xb8\x16z9M8\x8ds\x89\xff\x04\x18\x00 \xe7\xc4\xf5\x9d\xe11\x15\x00\x00\x00\x00IEND\xaeB`\x82") func imagesOpenshiftLogo222PngBytes() ([]byte, error) { return _imagesOpenshiftLogo222Png, nil } func imagesOpenshiftLogo222Png() (*asset, error) { bytes, err := imagesOpenshiftLogo222PngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/openshift-logo222.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesRedhatPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00j\x00\x00\x00\"\b\x06\x00\x00\x00\xb7*L\x96\x00\x00\x00\x04sBIT\b\b\b\b|\bd\x88\x00\x00\x00\tpHYs\x00\x00\r\xd7\x00\x00\r\xd7\x01B(\x9bx\x00\x00\x00\x19tEXtSoftware\x00www.inkscape.org\x9b\xee<\x1a\x00\x00\fNIDATh\x81\xed\x9a{\\\x94e\xf6\xc0\xbf\xef\xdc\x18\x06\u0411\xbb\x81\xe8\x06\xe1O4\x94L\xd4UQ@MM\x04\u0534\xb6t-/\x90Z\xa9\x80\xbf\u02bc\xa5\xe6u]7s\xd3\xd4\xfa\xedf\x1b\x99y\aI\xc1\vv\xd9@2-o-!\x13\x97\x14\x04a\xb8\r03\xef\xfeA\x8e32\x03\x04\xb2\xbf\u03ea\xdf\xcfg\xfe\x98\xf3\x9c\xf7y\xcey\xcf<\xcf{\xceyG\x10EQ\xa4\x85\x14]\xbf\xce\xf1\x13\xc7\xf9\xe7\xd7_s\xe1\xe2\x054\xb9\xb9\xd4\xd7\xd7\x03 \x93\xc9\xe8\u05ad\x1b\x01\x01=\x190p \xe1a\xe1\xb8{x\xb4t\xea\a4\x83\u0412@\x9d\x95J\u0166Mo\xf3\u0524I\xed\xe7\xcd=\x8c\xd5@\xad[\xbb\x865kVc>\xd4Q\x90\xb0\xc9\xc1\x19\x1f\xa9\xcc$\xd3!R/\x82\x1d\x90e\xa8#K_K\xb9h$Ln\xcfeC=\xbbt\x95wNM|\xc2B^\u007f}\x11\x82 \xb4\x8fG\xf7(\x92;\x05K\x97,f\xf5\uadf83~\xe3\x15*\x8b \x01(\x11p\x12\x04\x14\x82@\u007f\x99\x1d\xdd%\nN\xd6\xe98P[\xc54;Gz\xcb\x14\x8d\x16\u0730~\x1d\t\t\xf1w\u064d{\x1f\x8b\x1d\xf5Ib\"\xb1\xb1\xb3\xac*nvp!_\xd4\xe3&H\b\x92\xd9Y\xd5)\x11\r\x18\x017A\n\xc0eC=s+K\xb0v\xb6\xbe\xb3\xe5\xaf<\xfb\xecsmv\xe0~\xc1\x14\xa8\xdc\xdc\\\x06\x0f\x1aHUUU#%;\xe0@\a\x0f6\xd6h9Z_\x83\x83 P\v\b\xc0t\xa5#O)\x1cl.\x10_u\x93\xb3\xfa\xdaFr\x95JE\xfa\xe9/\x1f$\x18-\xc4t\x96-\\\x18o5H\x00\xfeR\x05rA ^\u0541\xb2j#\x1e\x82\x94!r%^\x12)\x9e\x12i\x93\v\x8cT(\xad\x06\xaa\xba\xba\x9a\x85\tq|\xb6w\u007f\x1b]\xb8?\x10DQ\x14O\x9d:IT\xe48\x9bJ}e\n\xd698\xb7j\x01\x1d\"\x13\u02cb\xa8\xb1z\x00\u009e={\t\x1f>\xbcUs\xb7'\x1b\u05af\xe3\u0739s\x84\x86\x8626b\x1c\xee\xee\xee\xff\xaf\xf6H\x00\xb6ly\xc7$\xe8\"\x951W\u0641\x8d\x0e\u03bc\xeb\xe8\xca*U'\xce\x1b\xeaI\xa9\xafi\xd5\x02J\x04\x86\u02156\u01f7l\xd9\u072ay\xdb\x1b\xadV\xcb\xe1\u00c7\x88\x8b[@R\xd2a\x93\xfc\u03193-.\xfa\xef&\x92\xa2\xa2\"N\x1c?\x0e@o\xa9\x82\x9d\x8e.D\u06e9\xe8-S\xe0/\x95\xd1S&\xc7 \x8a\xac\xaf.'\xb6\xf2\x06\x89\xb5U\xe4\x18\xebm\xec\x0f\xeb\x04Z\xc9\xfen\x91\x9e\x9e\u03b5k\xbf\xb4\u044d\xff\x1c\xd1Q\xe38\u007f\xfe|\xbb\xcc]SSCM\x8d\xf5\r!II9\x82^\xdfP\x9c\x06\xca\x15H\xb1\xaco\x9c\x04\tS\xed\x1c\x01\xf8\x97A\xcfv]\x053+J\x98\xa8-beu9\xc7\xebu\x18\x9a\t\x9b\xa3 \xd0S&'@&oT\x0f\x18\f\x06\x92\x93\x92Z\xe7\xd9=F\xef\xc0^\\\xb9r\xc5\xea\x98\u4aef\xbe4}9QWc\xf5\xa6OQ:\xb2\\\xa5\xa6\x8b\xe4v\x1dU&\x1a9Q_\u00ea\xea2>\xb0R\u061a\x93\xa5\xaf\xe3U{5\x9b\x1d\\\xf8\xbb\x93\x1b}\xef\xd8a_~\xf5\xd5o\xf1\u77a5\xba\xba\xda\xe6\x98\xe4\u214b\xa6/\xf9F\x03\x9bk*\xac\xee\x8f\xc1r%\xef;\xb9\xb2H\xa5&Xn\x87\u072c\xb3p\xa4\xae\x86\xba&v\xd5\x14\xa5\x03\x0f\xfd\x9a\x1dv\x96HY\xeb\xe0\xcc \xb3Z\xec\xe2\x85\v\xcd:\x91\x96\x9aJtT$\xd1Q\x91h4\x1a\xae\\\xbe\xcc\x1f\x9ey\x9aG\xfc\x1e&3#\u00e4WRR\xc2\xf2eK\x198\xa0?\xbf\xeb\xe6C\xaf\x9e\x01\xc4\xc6\xce\xe2G\x1b\xbf\xd4\xec\xecl\xe6\xcc~\x91^=\x03\xf0\u007f\u0117\xa8\xc8q\xa4\xa5\xa66k\xcf/\xbf\x14\x12\x1f\x1fG\xdf\xc7\xfa\xd0\xe3\u007f\xba\xf3\xcc\u04d3\xf9\xf6\xdbo\x1b\xe9]\xbe|\x89\xb8\xb8\x05\x84\x85\x0e\xc5\xcf\xf7w<\xde7\x88\xe5\u02d7Y\xb4\xe6\xfe8u\n\xd1Q\x91\xe8t:\xe2\xe3\xe6\x9b\xfc\u0735\xebC\x93\x8e,??\xcfb\xe2Cu\xd5\u0509\"\xf3\xec;\xa0\xb8\xa3\xcd#\x01\xc2\xe4J\xc2\xe4J*D\x91,}-Y\xfa:4F=\x9f\xd7\xd5\x10\xa1PYu\xcaE\xb0L\xe1\x05\xe0Y\xa5#_V6\xa4\xedw\xda`\x8d\x92\x92\x12N\x9e<\x01@fF\x06\t\tq\x94\x95\x95\x01\xa074\x1c\xdd\xdf\u007f\u007f\x9e\xf1\xd1Q\u0738q\xc3t]YY\x19\x9f$&r`\xff\x01>\u067d\x9b\x90\x90\xa1\xa6\xb1\u00c7\x0f1c\xc6tju:\x93\xec\u0529\x93\xa4\xa7\x9f\xe2\x11\u007f\u007f\x9b\xb6\\\xbd\x9a\u00c2\xf9\xaf\x10\x1b;\x9b\xb8\xb88t\xbaZ\xf6~\xb6\x87\x88\xb1c\u0637\xef\x00\xc1\xfd\xfb\x9bt\x13?\xfe\x18???bf\xc5\xe0\xee\xe1A\xd1\xf5\xeb,[\xb6\x94IOM$)\xf9\b\x82 \x90\xb0p!z\xbd\x811\xa3\x9f`\u05acX\xfc\xbbw\a\xc0\xc3\xe3v\xa6)\xb8\xb9:\x8b\xb7\xde)\x99\xe3/\x95\x11o\xdf\x11_\xa9\xbc\u065b\xd8\x1a\xf2\fz\xa6U6\xdcPA\x10(\xbeQ\x8aTj\xbb&\u06f7o//>\xa8\xec\xed),,d\xf4\xe816\u05f8\x13Y\xef>AV\xb3\x15\xc0\xf4\x90U(\x14\xbc\xbbu\x1b\xfb\xf7\xefC\xa3\xd1\xf0\xd2\xf6\xf7\xf0\x94H\x19&W\x12(U\x10 \x93\xe3$\xd8\xde\x11F\xe0{}\x1d'\xeau$[)\x01\x82\x82\x82\x9a5T4\xbb\xc6|'\x01\x18\x8dF\xeaj\x1b\x12\x13\xa9T\x8a\x93\x93\x93\xcdy\u051d:\xa13K\x1e\x14\nE\xb3\xbb\xb9\xb5\x88\xa2\u023cW^\xe6\xec\u0673,]\xba\x8c\x01\x03\a\xe2\xe0\xd0\xd0\xc0^\xfc\xc6\"***Z<\x97l\xf0\xa0A|\xf0\xfeN\x93\xc0\xc3\u04d3\x90\x90\x10\xfe\xf9\xf5\u05ec\\\xb9\x82\x11#\x9f\xc0\xc7\xc7\aooo\xe6\xce}\tQ\x14)//\xe3\xd3\u077bI\xac\xad\"\x91*\x04\xc0S\"\xc5S\"\xc3]\x90\x98R\xf7*Q$\xcfXO\x81\xc1`\xb3\xd7\a\xd0/8\xb8EN\xdbB\"\x91\xe0\xea\xeaJqq1^^^\x9c;\xffC\x93s\x19\x8dF\xec\xec\uca2d\xad\xa5\xb2\xb2\x92\xeb\u05ee\xe1\xe1\xe9i\xa1s+\xa3l\v\x87\x0e\x1d$--\x8do22M\x01j-\x92\u0430p\xfe\xbc\xe9/\xfc\xf5\u076d\x1c=\x9a\u0285\v\x97x\xef\xbd\x1d\x9cj,\u0543\aP\x1a\xe0\x8f\u07c8\x11M\x06I&\x931z\xd4\xe869\x010h\xd0`\x00~\xfe\xf9g\x92\x93\x9b\xeetH$\x12\x82\x83o?gv\xec\xdca1^QQ\xc1\u77e7\xb4\u0666\xb4\xd4T\xc2\xc3\u00ed\x06\u027c\x8e\xbaES\t\x95\xacS\xa7NL\x9b\xf6|\xa3\x01ggg\x92\x93S\xf8\xe2\x8b\u04cd2 A\x10\x88\x8d}\x91\xd8\xd8\x17\x9b5\xf6O\x1b\u0593\x92r\xc4\xe6xXxx\xa3_\xb35\x9a\xfb\xb3\xd4\xec\xd9s8x\xf0\x00F\xa3\x91Y3g\U0003fbfeFt\xf4x\x1c\x1d\x1d\xa9\xaa\xaa$''\x87\xd2\xd2R\"#\xa3\x00\x98:\xf5\x8f\x9c>\x9d\x0e\xc0\xc6?m\xc0^\xa9$2*\x1a\x8dF\xc3\xea\xb7VRl\xf6\xa0\xd7\xd7\ubb6e\xd9\x1c2\xb9\x9c\x9b\xa5\xa5\x8d\xe4\xe5\xe5\xe5$%\x1df\u0108\x91\x16r\x17\x17\x17\xb4\xdar\xabs5y8\xbb\xb8\xb8\x10\x19\x19\x85Z\xadn\u05a8\x1f~\xf8\x1e\xa3\xd1H\xd1\xf5\xeb\x16r\xf3\x16\x955f\u03de\u00e5K\x97\xb8\xf4k2`\x8b\xe6\x02\xd5/8\x98\xc5K\x96\x02PUU\u0152\xc5o\xf0h\xaf\x00Swb\\\xc4XV\xad\\a\u049f0q\"O\x8c\x1a\x054\x1c\x85+V\xbc\xc9\xe3}\x83\x980>\x8a3g\xce0i\xf2d\x93nm]\xe3\xf7i-!\"\"\x82\x94\x94#\xa6L\x13\xa0\xb0\xb0\x80\xa9S\x9e\xa3g\xcf^h\xb5Z\v}\xff\xee\xdd\xf9l\xcf\x1e\vY~~>\x17/^l:P-\xe5\xe6\u035b\xacZ\xb9\x92A\xbf\x1f\u021bo.7\u024dF#W\xae\xfch\xf3\xba\x11#G2t\xe80\n\v\nlf\x9e\xb7\x90\xcb\xe4\xa8\xd5j\xd4j5\xf6*\xeb\x1d\x90y\xf3\xe6\xf3\xd1?>\xa6\xff\x80\x01\x8d\x8a\xe7\u039d\x1fb\xf0\x90\x10\x8c\u0186lS\x10\x04\xfe\xf6\xb7\x0f\x993g.\xf6\xf6\xf6&=gggV\xafYK|\\\x82i=\xf3#\xa9cG52\x99\xed\u00bcc\x87\x0e\xc8d\r\xb5\xe9\xb0a\xa1\xbc\xbe\xe8\r\xc6>9\x9a1\xa3G\x11\x16:\x94\x89\x13&0+&\x86\xe93f\x98l\xb9\xc5\xe2\xc5KHMM%8\xf8q\x1e\xef\x1b\u0131\xa3G\xf9\xe9\xa7l4\x9a\u0716\xfd\x01\xb3\xa5TWWcooorl\u03e7\x9f2s\xe6t\x00\x96,YJX\xf8p|}}Q*\x95\x14\x14\x14\xe0\xe4\u4133\xb33\x06\x83\x01Q\x14M\x0e\xde\r\xca\xca\xca((\xc8G*\x95\xe2\xe5\xe5\xddd&\xa8\xd3\xe9\xb8z5\aA\x10x\xf8a_\x14\n\u06efeZ\x83V\xab%''\a\x17\x17\x17\xbc\xbd\xbd\x9b|\x16\xd5\xd6\u0592\x93\xf3\x13\x00\xfe\xfe\xddM\xf6\xdd\xd5@\x99\x93\x9b\x9bK\xe8\xb0\x10\x94J{bbb\x987\u007fA{,s\xdf\xd0.\x81\x12E\x91\xf1\xd1Q\b\x02|\xb8\xeb\x1fmNM\x1f\xd0L2\xd1Z\xde\u06f6\r'''\xfe\xfe\xe1G\x0f\x82t\x97h\xb7\xa3\xef\x01w\x97\xf6\xe9\x9d<\xe0\xae\xf3 P\xff%<\b\xd4\u007f\t\xff\x06\f\x89\x9f\xb0\x94\x98:J\x00\x00\x00\x00IEND\xaeB`\x82") func imagesRedhatPngBytes() ([]byte, error) { return _imagesRedhatPng, nil } func imagesRedhatPng() (*asset, error) { bytes, err := imagesRedhatPngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/redhat.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesRedhatSvg = []byte(``) func imagesRedhatSvgBytes() ([]byte, error) { return _imagesRedhatSvg, nil } func imagesRedhatSvg() (*asset, error) { bytes, err := imagesRedhatSvgBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/redhat.svg", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _imagesSpriteVertPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\x00\x00\x01\xe0\b\x06\x00\x00\x00\xa5\xfdM\xb6\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xc9e<\x00\x00\t_IDATx\xda\xec\xda\x0fPS\xf7\x1d\x00\xf0\xf7\xf2\xe7\xbd\xfc\x0f\x89\x11C@d\xfcS!\xc00\xd0\x1aA\x91\xd5U\x87\xadNk7\xa7\xfb\xd7\xd6y\xf3\u06ba\u06e6\xb7^\u7b7b\u04ed\xbd\xaa\u05ee\xed\xa9\xe8\xb6v[\xa7\x9b\xa2\u0573\xad\xce\u007f\x1dh\xb5\xe0\xa8Sf)\u007f\x92\bB\x12\bB0\t\t\xf9\xf3\xb2\xef\x8b\x0f\x17\x10\x02\xd5\u062d\xb7\xef\xbb\xfb\xde%/\xef}\xde\xf7\xfd~\xdf\xdf\xe3\xf2%d\x186\x82 H\"N\x1by\xcb#\xe2\x86\x0e\x81qC\xa3\xc1\xb8\xa0#\xc1{FG\x03\xef\t\xbd\xef\x19\xc6u\f\xe3:\xcbq\xad\xc3\xfb\xb2R\b\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\xf0\v\x05\x8e\xec7\xdc\xe3\x05\xc8\xf0\u020eH\x9c\xc0\xff\xa0q\x04o\xa1\xe10\xf9?\x99a\\\xc70\u03b3\x8cK\x0fA\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\x10A\x04\xbf\x98 \xfe\xaa\n\u007f\x11\x84+\x05A\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\x10A\x04\xff\x1f\xc0\xb5k\xd7\x0ek\x11TVV\xde\x13\xc8\u3c38\xa5\xc9\x1b\xca4^(/\xfa\xf6\xe3\x81F\x83qi\xb7\xf0\xe2\x89\r\x81\xd8\bB\x10A\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\x10A\x04IZ\x16y\xf1\xc8\xc3\xe5\xf3\xb5Z\xed\xf6\xf4\xf4\xf4\x02\xa1P\xc8\xf3\xfa|\x8c\xd9d\xba\xd4\xd8\xd4\xfc\xb3\xda\xfa\xcb\x17\xe0\x90A\bf$\xc0\xf8\\\xc3\xc1\x8a\x8a\n\x81\\.\xffUqq\xf1F\x9a\xa6\u024e\x8e\x0e\xaf\xdf\xef\x0fJ$\x12\x1a.@\xb9\\\xee\xf0\xe93g\xb6\x9c9{\xe1U8\xbe\x1f\"\x14\v\x14P4\xbdj\u05acY\x1b\xdc\x1eO\xa8\xba\xe6l\u077b\u007f;\xfd'\xd8\xef\xa3(!\xb9\xf0+e\xeb\xe6\x18\x8dEee\xf3\x9ew\xf6\u07fc\xf1\xf1\x95\xabo\xc3g}\xa3ez\xbb+\x92\xa4\xd5n\x12\b\x04\xe4\xb1\xe3'\xf6\x01\xf6&\xec\xb3@\xd4\xfa\xfd\x813G\x8f\x9fz\xe2\xfc\x85\v'\xd5*\x15?O\x9f\xb3\x01\xf6\xa7B\x88c\xb6Y\xb2`kii\u9abf\xdcp\x0e\u079b \xae@\xb4B\xb4C\xb4X\xda\xda\u007f\xedp8\x82\xba\xa4\xa4\u0134\xa9\xc9\xf3`\x9frD\x03i8HQ\x14\xe1r\xbb]\xa1\x10\xe3\xe6\x10\aD\x80\xeb\xe7\xf8C\xc1P\x83\xcdnoW\xa9TB\xb5*!\x17\xf6%\xb0C5&\u0216\r%\xa4D\xec\xc9\x10^\x88`\xf4\x01):\xadL\"\x16\xcb=\x1e\x0f\x03\x17\xbe\t\xbbD1A\xb3\xd9\u0713\x97\xa7O1\x16\x17>2\xda\xc1\"\x91\u0218\x96\x966\xb9\xd3juX\xda;\x9b\xb8\xecCc\x81\x82V\x93\xe9-\xa8\xbd\r\xe5e\xf3V1\fs\xad\xe7F\xef^\x85\\fU*\xe4\x02\xc8,K\xaf\xcf\xfd=\x94\x11\xd3\xd4\xd4r1\x18\f:\xb9\xd2\t\xc6*l\xe5\xe3K\x17\xbf;{\xf6\x83%<\x1e\x8f\xb4\xdb\xed\x03===\u05d4J\xa5\x16\n\x9cNII\x91\xd6\xd7\u007f\xdc\xf1\xd6\xde\xfd\x9b\xe1\xf8O \x1a8t\xd4:\xe4\x93\x02*\xf4IS\xcbq\x1e\xc1\xa4\x89E\xa2t\x85R\xc9\x16\xf4d!E\xd1\x1a\x8d\x86&I\x92\b\x06\x03\xb4\xd9b9\xef\xf6\f\\\x82s\xba\xa3\xeb\xf0\x85M\u03cf\xba\xf4(\x88D\x88t\xfd\xcc\xecG\x15ry:\xdc\xfa\xf5\xc2\x02\xfd\xe2\u0492\x92L\xf6\x00\xa8G\xf3\xbe\xaa#\xcb\xe1e37y\xa3/\xbd\xa1\xb5\f\x9b\x10B\xc6\u0559\n\x82N\x9c<)q\u075a'\x0eA\xa6\xfc\xde\xde^\xe6\xc8\xd1\xf7\xb6\xc2jy\x1d>\xb3\x0fM\xcch\xb7|\xfbb\uc483pq\u02eb\aj\xb3S\"\xa2\xa7ed\xa4\xe7\x89\xc5bR\xc0\xe7\u03c0\"\xffG\xbf\xcb\xdd\u0255\xd9\x1d\xb7\x9f/\xc9l2M\xe3\xba#c\x83\xec \a\x83A\x19\xd7\x13\f\x8c\x1c\xf4\xb3\xd55\xf4\xe0\xe0\xa0\x06&\xa7O\xa7\xd3y\xb8V\xcb\xd8 dv\xd2j\xed\xacxq\xcb\xe6\a\xb8\xf1\x19vp \x18\xf8R0\x10x(A\xa5\xba\xbc\xf0k\x15\x1dD\x8c\xeefd\x92&i4{lV\xeb\x823\xa7Om\f\x85B\xb6$\x9d\xee\xfc\x87\xe7\u03b9n\xf6;\u064e\x9c\x06\xcag\x0f\u0524\xc7`(:+\x91H\x06\xb8\xbe\x18\x13\xab\xb0\xe9o<\xb6l\x13\xa0?e/\x00\x197@\t]\x841c\xfb\x86\n\x18\x8eb]r\xf2\xc1\x03\x87\x0e\xbf\xcaM\x98\x8d\xb8\xd5\xc6\x1f\xb5\x0e\xd91\f\xec?\xf8\xceV}^\xfesR\xa9\xecS(\xa3\x14(\xe8\xd5$\x8f\x97\v\x19\x1b\u0603<\x1eO\xce\u017aZ\t\u06f1\xe3\xc6y\u0725\xc7\xc2\xec\xc4h\xde\xfc\xddo\rv\x9b-9{\xc6\f\xfb\xd1#\x87\x17\xb547\u007f\x8f= ##\xf3\xcf\u007f\u073bo#WR\xc1\xb12$X\x90\v\x1e\x84\bB\x05\xa1\x83H\xad>\xf7a\xae\xd1hl\x83\xe5\x19\x86Ub\u007fy\xeb\xb6\xe5\xb0_\x0eA\x0e\x9d\xc7>\\\xa2#\xba!9\xd4\xe1tr\x05nK\x9d\x96f\xd2&%\xbd\x18\xb9\xb0\xd7;\xa5\xa6\xfa\xef?<~\xec\xfdi\\\xe9\x8cY\x87#\xb70W\x1a\x81\xa4\xa4$_\xd9\xfc\xf2\x032\x99\xac:RB\x81\xe0dGwwZ\xac\xe2\xbe\xfd\xf8\x8a\xb5<\u05ed\xfd\xc1\xbc@\xc0\xbfx\xc9\xd2eW\x8a\x8a\x8b\x1ba\xd6\xd9\u007fB\xb0\rI\xe6\x8e\xc7\xd7\x04\xc0\xc8\xd8wwuMJ\x9c2\x85\xe2\uac1f+\x9d\xf0\u0742$\xb7\x8ax\xdcp\xdc~\xd8\xde-8v\xea\xf7\x1d\u013f\xcb\b\"\x88 \x82\b\"\x88 \x82\b\"\x88 \x82\xffu\xb0\xaa\xaa\x8a\xb8t\xe9\x92233\xf3 \xc30\xc7\xda\xda\u06b6\x8bD\"\xa2\xb3\xb3\x93\xe8\xe9\xe9!(\x8a\x12\xb8\\\xae\xc5W\xaf^\xadmnn\xb6\x8f\xfb\xe5\x1a\x0e\xfeIVVVZFF\x86\xdbh4\xfe\x82\xa6\xe9\x82\u0215\"\xbf\xf7\n\x12j\xb5\xfa\xfb+V\xac8\f\x9f\x97N$C\x9eV\xab]\xaf\xd7\xebw\n\x04\x02\x11d\xa9HNN~\xd2\xe3\xf1D\xb2\x93\xcb\xe5k\x8a\x8a\x8av\xd9l\xb6\xfd*\x95\ua0c9\x80\x82\xf6\xf6\xf6\xb7\x01\xfcybbb$+\xa5R\xa9\xf7z\xbd4\\\xe0\x9b\x85\x85\x85{`8\x0e\xc11k\xe03\xd7D@\xbe\xc1`\xf8\xa7\xdb\xed\x9ef\xb7\u06c3V\xabU\x90\x9f\x9f\x9f\x03\xe38[\xa3\xd1<\t\xd0\u1fbe\xbe\xa7 ;7\\\x80X\xb2d\xc9\xf8\x19\n\x85\xc2^\x00V\xd7\xd5\xd5\xf1a\x02\xe6\\\xbf~\xfd\x1d\x00\xbej6\x9b\xdb \xd3g {7\x8c+\x01\x17\x9d\xd0,\U000f3cf3\t\x93\xc9\x14v8\x1cT(\x14\xfa6\\\xa0$\x10\b\b\x16,X\x90\x00\x132\x85\xcf\xe7Oe\u06c10\xae\x96\xb2\xb2\xb2\xf1Av\xecx<^jnn\xeek\xe5\xe5\xe5\xcf\xd6\xd4\xd4\xd4\xf5\xf7\xf7o,((\x98\a\xefKsrr* \xe3\xc7[[[O\u035d;\xb7s\xdcY\x86\u06d9\x05'\x9e\x86\xb1\\U]]m\x81\x13\x9f\x83l\xaa\xae]\xbbv\x85\x1d\xb7\xfa\xfa\xfan\xc8Z\x04\x17|aB\xb3\fc\xb4E*\x95f\x9e8q\"x\xf2\xe4\u024d01\xe7\x1b\x1b\x1b\t\x99LVSZZ\xfa0\xec\xdb\x06\xe3GM\x9d:\xf5\xc1\t\xad\x94E\x8b\x16m\x86,\xd7\xc0J\xd8e\xb1X^\x81qd\xd7\"#\x91H\xa4\xeb\u05ef\xdf?88(\u067d{\xf72\xc8\xd6\xebt:{\xc7\x15af\xd5\t\t\t\x15\xf0\x92m\x92)\x88[?n\x8c\xfc\x86\x10\xb2\x9c\xa9\xd3\xe9\xbe\x055\xa8\x8b4\xc5Ft\xe2F\v|\x1e\"\x88 \x82\b\"\x88 \x82\b\"\x88 \x82\b\"\x88\xe0\xe7\x00\x0e}\x13\x17C\x9c\b\x0f\xdf\\\x10e\x13\xf9\x16\x1f\x1d\xd1o(\x88#\x1c\xe6\x840~Vl$8\x84\xee\x800\xdc\r\x86=\a\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\x10A\x04\x11D\x10\xc1\xb8m\xff\x16`\x00$H|\xb56&\xcf\xff\x00\x00\x00\x00IEND\xaeB`\x82") func imagesSpriteVertPngBytes() ([]byte, error) { return _imagesSpriteVertPng, nil } func imagesSpriteVertPng() (*asset, error) { bytes, err := imagesSpriteVertPngBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "images/sprite-vert.png", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _indexHtml = []byte(` OpenShift Web Console
`) func indexHtmlBytes() ([]byte, error) { return _indexHtml, nil } func indexHtml() (*asset, error) { bytes, err := indexHtmlBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "index.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _robotsTxt = []byte(`# robotstxt.org User-agent: * `) func robotsTxtBytes() ([]byte, error) { return _robotsTxt, nil } func robotsTxt() (*asset, error) { bytes, err := robotsTxtBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "robots.txt", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _scriptsOldieshimJs = []byte(`!function(a, b) { "function" == typeof define && define.amd ? define(b) :"object" == typeof exports ? module.exports = b() :a.returnExports = b(); }(this, function() { function a() {} function b(a) { return a = +a, a !== a ? a = 0 :0 !== a && a !== 1 / 0 && a !== -(1 / 0) && (a = (a > 0 || -1) * Math.floor(Math.abs(a))), a; } function c(a) { var b = typeof a; return null === a || "undefined" === b || "boolean" === b || "number" === b || "string" === b; } function d(a) { var b, d, e; if (c(a)) return a; if (d = a.valueOf, l(d) && (b = d.call(a), c(b))) return b; if (e = a.toString, l(e) && (b = e.call(a), c(b))) return b; throw new TypeError(); } var e = Function.prototype.call, f = Array.prototype, g = Object.prototype, h = f.slice, i = Array.prototype.splice, j = Array.prototype.push, k = Array.prototype.unshift, l = function(a) { return "[object Function]" === g.toString.call(a); }, m = function(a) { return "[object RegExp]" === g.toString.call(a); }; Function.prototype.bind || (Function.prototype.bind = function(b) { var c = this; if (!l(c)) throw new TypeError("Function.prototype.bind called on incompatible " + c); for (var d = h.call(arguments, 1), e = function() { if (this instanceof j) { var a = c.apply(this, d.concat(h.call(arguments))); return Object(a) === a ? a :this; } return c.apply(b, d.concat(h.call(arguments))); }, f = Math.max(0, c.length - d.length), g = [], i = 0; i < f; i++) g.push("$" + i); var j = Function("binder", "return function(" + g.join(",") + "){return binder.apply(this,arguments)}")(e); return c.prototype && (a.prototype = c.prototype, j.prototype = new a(), a.prototype = null), j; }); var n, o, p, q, r, s = e.bind(g.hasOwnProperty), t = e.bind(g.toString); (r = s(g, "__defineGetter__")) && (n = e.bind(g.__defineGetter__), o = e.bind(g.__defineSetter__), p = e.bind(g.__lookupGetter__), q = e.bind(g.__lookupSetter__)), 2 !== [ 1, 2 ].splice(0).length && (!function() { function a(a) { for (var b = []; a--; ) b.unshift(a); return b; } var b, c = []; if (c.splice.bind(c, 0, 0).apply(null, a(20)), c.splice.bind(c, 0, 0).apply(null, a(26)), b = c.length, c.splice(5, 0, "XXX"), b + 1 === c.length) return !0; }() ? Array.prototype.splice = function(a, b) { var c, d = h.call(arguments, 2), e = d.length; if (!arguments.length) return []; if (void 0 === a && (a = 0), void 0 === b && (b = this.length - a), e > 0) { if (b <= 0) { if (a === this.length) return j.apply(this, d), []; if (0 === a) return k.apply(this, d), []; } return c = h.call(this, a, a + b), d.push.apply(d, h.call(this, a + b, this.length)), d.unshift.apply(d, h.call(this, 0, a)), d.unshift(0, this.length), i.apply(this, d), c; } return i.call(this, a, b); } :Array.prototype.splice = function(a, b) { return arguments.length ? i.apply(this, [ void 0 === a ? 0 :a, void 0 === b ? this.length - a :b ].concat(h.call(arguments, 2))) :[]; }), 1 !== [].unshift(0) && (Array.prototype.unshift = function() { return k.apply(this, arguments), this.length; }), Array.isArray || (Array.isArray = function(a) { return "[object Array]" === t(a); }); var u = Object("a"), v = "a" !== u[0] || !(0 in u), w = function(a) { var b = !0; return a && a.call("foo", function(a, c, d) { "object" != typeof d && (b = !1); }), !!a && b; }; Array.prototype.forEach && w(Array.prototype.forEach) || (Array.prototype.forEach = function(a) { var b = S(this), c = v && "[object String]" === t(this) ? this.split("") :b, d = arguments[1], e = -1, f = c.length >>> 0; if (!l(a)) throw new TypeError(); for (;++e < f; ) e in c && a.call(d, c[e], e, b); }), Array.prototype.map && w(Array.prototype.map) || (Array.prototype.map = function(a) { var b = S(this), c = v && "[object String]" === t(this) ? this.split("") :b, d = c.length >>> 0, e = Array(d), f = arguments[1]; if (!l(a)) throw new TypeError(a + " is not a function"); for (var g = 0; g < d; g++) g in c && (e[g] = a.call(f, c[g], g, b)); return e; }), Array.prototype.filter && w(Array.prototype.filter) || (Array.prototype.filter = function(a) { var b, c = S(this), d = v && "[object String]" === t(this) ? this.split("") :c, e = d.length >>> 0, f = [], g = arguments[1]; if (!l(a)) throw new TypeError(a + " is not a function"); for (var h = 0; h < e; h++) h in d && (b = d[h], a.call(g, b, h, c) && f.push(b)); return f; }), Array.prototype.every && w(Array.prototype.every) || (Array.prototype.every = function(a) { var b = S(this), c = v && "[object String]" === t(this) ? this.split("") :b, d = c.length >>> 0, e = arguments[1]; if (!l(a)) throw new TypeError(a + " is not a function"); for (var f = 0; f < d; f++) if (f in c && !a.call(e, c[f], f, b)) return !1; return !0; }), Array.prototype.some && w(Array.prototype.some) || (Array.prototype.some = function(a) { var b = S(this), c = v && "[object String]" === t(this) ? this.split("") :b, d = c.length >>> 0, e = arguments[1]; if (!l(a)) throw new TypeError(a + " is not a function"); for (var f = 0; f < d; f++) if (f in c && a.call(e, c[f], f, b)) return !0; return !1; }); var x = !1; if (Array.prototype.reduce && (x = "object" == typeof Array.prototype.reduce.call("a", function(a, b, c, d) { return d; })), Array.prototype.reduce && x || (Array.prototype.reduce = function(a) { var b = S(this), c = v && "[object String]" === t(this) ? this.split("") :b, d = c.length >>> 0; if (!l(a)) throw new TypeError(a + " is not a function"); if (!d && 1 === arguments.length) throw new TypeError("reduce of empty array with no initial value"); var e, f = 0; if (arguments.length >= 2) e = arguments[1]; else for (;;) { if (f in c) { e = c[f++]; break; } if (++f >= d) throw new TypeError("reduce of empty array with no initial value"); } for (;f < d; f++) f in c && (e = a.call(void 0, e, c[f], f, b)); return e; }), Array.prototype.reduceRight || (Array.prototype.reduceRight = function(a) { var b = S(this), c = v && "[object String]" === t(this) ? this.split("") :b, d = c.length >>> 0; if (!l(a)) throw new TypeError(a + " is not a function"); if (!d && 1 === arguments.length) throw new TypeError("reduceRight of empty array with no initial value"); var e, f = d - 1; if (arguments.length >= 2) e = arguments[1]; else for (;;) { if (f in c) { e = c[f--]; break; } if (--f < 0) throw new TypeError("reduceRight of empty array with no initial value"); } if (f < 0) return e; do f in this && (e = a.call(void 0, e, c[f], f, b)); while (f--); return e; }), Array.prototype.indexOf && [ 0, 1 ].indexOf(1, 2) === -1 || (Array.prototype.indexOf = function(a) { var c = v && "[object String]" === t(this) ? this.split("") :S(this), d = c.length >>> 0; if (!d) return -1; var e = 0; for (arguments.length > 1 && (e = b(arguments[1])), e = e >= 0 ? e :Math.max(0, d + e); e < d; e++) if (e in c && c[e] === a) return e; return -1; }), Array.prototype.lastIndexOf && [ 0, 1 ].lastIndexOf(0, -3) === -1 || (Array.prototype.lastIndexOf = function(a) { var c = v && "[object String]" === t(this) ? this.split("") :S(this), d = c.length >>> 0; if (!d) return -1; var e = d - 1; for (arguments.length > 1 && (e = Math.min(e, b(arguments[1]))), e = e >= 0 ? e :d - Math.abs(e); e >= 0; e--) if (e in c && a === c[e]) return e; return -1; }), !Object.keys) { var y = !{ toString:null }.propertyIsEnumerable("toString"), z = function() {}.propertyIsEnumerable("prototype"), A = [ "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor" ], B = A.length, C = function(a) { var b = t(a), c = "[object Arguments]" === b; return c || (c = !Array.isArray(b) && null !== a && "object" == typeof a && "number" == typeof a.length && a.length >= 0 && l(a.callee)), c; }; Object.keys = function(a) { var b = l(a), c = C(a), d = null !== a && "object" == typeof a, e = d && "[object String]" === t(a); if (!d && !b && !c) throw new TypeError("Object.keys called on a non-object"); var f = [], g = z && b; if (e || c) for (var h = 0; h < a.length; ++h) f.push(String(h)); else for (var i in a) g && "prototype" === i || !s(a, i) || f.push(String(i)); if (y) for (var j = a.constructor, k = j && j.prototype === a, m = 0; m < B; m++) { var n = A[m]; k && "constructor" === n || !s(a, n) || f.push(n); } return f; }; } var D = -621987552e5, E = "-000001"; Date.prototype.toISOString && new Date(D).toISOString().indexOf(E) !== -1 || (Date.prototype.toISOString = function() { var a, b, c, d, e; if (!isFinite(this)) throw new RangeError("Date.prototype.toISOString called on non-finite value."); for (d = this.getUTCFullYear(), e = this.getUTCMonth(), d += Math.floor(e / 12), e = (e % 12 + 12) % 12, a = [ e + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds() ], d = (d < 0 ? "-" :d > 9999 ? "+" :"") + ("00000" + Math.abs(d)).slice(0 <= d && d <= 9999 ? -4 :-6), b = a.length; b--; ) c = a[b], c < 10 && (a[b] = "0" + c); return d + "-" + a.slice(0, 2).join("-") + "T" + a.slice(2).join(":") + "." + ("000" + this.getUTCMilliseconds()).slice(-3) + "Z"; }); var F = !1; try { F = Date.prototype.toJSON && null === new Date(NaN).toJSON() && new Date(D).toJSON().indexOf(E) !== -1 && Date.prototype.toJSON.call({ toISOString:function() { return !0; } }); } catch (G) {} F || (Date.prototype.toJSON = function(a) { var b, c = Object(this), e = d(c); if ("number" == typeof e && !isFinite(e)) return null; if (b = c.toISOString, "function" != typeof b) throw new TypeError("toISOString property is not callable"); return b.call(c); }); var H = 1e15 === Date.parse("+033658-09-27T01:46:40.000Z"), I = !isNaN(Date.parse("2012-04-04T24:00:00.500Z")) || !isNaN(Date.parse("2012-11-31T23:59:59.000Z")), J = isNaN(Date.parse("2000-01-01T00:00:00.000Z")); Date.parse && !J && !I && H || (Date = function(a) { function b(c, d, e, f, g, h, i) { var j = arguments.length; if (this instanceof a) { var k = 1 === j && String(c) === c ? new a(b.parse(c)) :j >= 7 ? new a(c, d, e, f, g, h, i) :j >= 6 ? new a(c, d, e, f, g, h) :j >= 5 ? new a(c, d, e, f, g) :j >= 4 ? new a(c, d, e, f) :j >= 3 ? new a(c, d, e) :j >= 2 ? new a(c, d) :j >= 1 ? new a(c) :new a(); return k.constructor = b, k; } return a.apply(this, arguments); } function c(a, b) { var c = b > 1 ? 1 :0; return f[b] + Math.floor((a - 1969 + c) / 4) - Math.floor((a - 1901 + c) / 100) + Math.floor((a - 1601 + c) / 400) + 365 * (a - 1970); } function d(b) { return Number(new a(1970, 0, 1, 0, 0, 0, b)); } var e = new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"), f = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 ]; for (var g in a) b[g] = a[g]; return b.now = a.now, b.UTC = a.UTC, b.prototype = a.prototype, b.prototype.constructor = b, b.parse = function(b) { var f = e.exec(b); if (f) { var g, h = Number(f[1]), i = Number(f[2] || 1) - 1, j = Number(f[3] || 1) - 1, k = Number(f[4] || 0), l = Number(f[5] || 0), m = Number(f[6] || 0), n = Math.floor(1e3 * Number(f[7] || 0)), o = Boolean(f[4] && !f[8]), p = "-" === f[9] ? 1 :-1, q = Number(f[10] || 0), r = Number(f[11] || 0); return k < (l > 0 || m > 0 || n > 0 ? 24 :25) && l < 60 && m < 60 && n < 1e3 && i > -1 && i < 12 && q < 24 && r < 60 && j > -1 && j < c(h, i + 1) - c(h, i) && (g = 60 * (24 * (c(h, i) + j) + k + q * p), g = 1e3 * (60 * (g + l + r * p) + m) + n, o && (g = d(g)), -864e13 <= g && g <= 864e13) ? g :NaN; } return a.parse.apply(this, arguments); }, b; }(Date)), Date.now || (Date.now = function() { return new Date().getTime(); }), Number.prototype.toFixed && "0.000" === 8e-5.toFixed(3) && "0" !== .9.toFixed(0) && "1.25" === 1.255.toFixed(2) && "1000000000000000128" === (0xde0b6b3a7640080).toFixed(0) || !function() { function a(a, b) { for (var c = -1; ++c < g; ) b += a * h[c], h[c] = b % f, b = Math.floor(b / f); } function b(a) { for (var b = g, c = 0; --b >= 0; ) c += h[b], h[b] = Math.floor(c / a), c = c % a * f; } function c() { for (var a = g, b = ""; --a >= 0; ) if ("" !== b || 0 === a || 0 !== h[a]) { var c = String(h[a]); "" === b ? b = c :b += "0000000".slice(0, 7 - c.length) + c; } return b; } function d(a, b, c) { return 0 === b ? c :b % 2 === 1 ? d(a, b - 1, c * a) :d(a * a, b / 2, c); } function e(a) { for (var b = 0; a >= 4096; ) b += 12, a /= 4096; for (;a >= 2; ) b += 1, a /= 2; return b; } var f, g, h; f = 1e7, g = 6, h = [ 0, 0, 0, 0, 0, 0 ], Number.prototype.toFixed = function(f) { var g, h, i, j, k, l, m, n; if (g = Number(f), g = g !== g ? 0 :Math.floor(g), g < 0 || g > 20) throw new RangeError("Number.toFixed called with invalid number of decimals"); if (h = Number(this), h !== h) return "NaN"; if (h <= -1e21 || h >= 1e21) return String(h); if (i = "", h < 0 && (i = "-", h = -h), j = "0", h > 1e-21) if (k = e(h * d(2, 69, 1)) - 69, l = k < 0 ? h * d(2, -k, 1) :h / d(2, k, 1), l *= 4503599627370496, k = 52 - k, k > 0) { for (a(0, l), m = g; m >= 7; ) a(1e7, 0), m -= 7; for (a(d(10, m, 1), 0), m = k - 1; m >= 23; ) b(1 << 23), m -= 23; b(1 << m), a(1, 1), b(2), j = c(); } else a(0, l), a(1 << -k, 0), j = c() + "0.00000000000000000000".slice(2, 2 + g); return g > 0 ? (n = j.length, j = n <= g ? i + "0.0000000000000000000".slice(0, g - n + 2) + j :i + j.slice(0, n - g) + "." + j.slice(n - g)) :j = i + j, j; }; }(); var K = String.prototype.split; 2 !== "ab".split(/(?:ab)*/).length || 4 !== ".".split(/(.?)(.?)/).length || "t" === "tesst".split(/(s)*/)[1] || "".split(/.?/).length || ".".split(/()()/).length > 1 ? !function() { var a = void 0 === /()??/.exec("")[1]; String.prototype.split = function(b, c) { var d = this; if (void 0 === b && 0 === c) return []; if ("[object RegExp]" !== Object.prototype.toString.call(b)) return K.apply(this, arguments); var e, f, g, h, i = [], j = (b.ignoreCase ? "i" :"") + (b.multiline ? "m" :"") + (b.extended ? "x" :"") + (b.sticky ? "y" :""), k = 0; for (b = new RegExp(b.source, j + "g"), d += "", a || (e = new RegExp("^" + b.source + "$(?!\\s)", j)), c = void 0 === c ? -1 >>> 0 :c >>> 0; (f = b.exec(d)) && (g = f.index + f[0].length, !(g > k && (i.push(d.slice(k, f.index)), !a && f.length > 1 && f[0].replace(e, function() { for (var a = 1; a < arguments.length - 2; a++) void 0 === arguments[a] && (f[a] = void 0); }), f.length > 1 && f.index < d.length && Array.prototype.push.apply(i, f.slice(1)), h = f[0].length, k = g, i.length >= c))); ) b.lastIndex === f.index && b.lastIndex++; return k === d.length ? !h && b.test("") || i.push("") :i.push(d.slice(k)), i.length > c ? i.slice(0, c) :i; }; }() :"0".split(void 0, 0).length && (String.prototype.split = function(a, b) { return void 0 === a && 0 === b ? [] :K.apply(this, arguments); }); var L = String.prototype.replace, M = function() { var a = []; return "x".replace(/x(.)?/g, function(b, c) { a.push(c); }), 1 === a.length && "undefined" == typeof a[0]; }(); if (M || (String.prototype.replace = function(a, b) { var c = l(b), d = m(a) && /\)[*?]/.test(a.source); if (c && d) { var e = function(c) { var d = arguments.length, e = a.lastIndex; a.lastIndex = 0; var f = a.exec(c); return a.lastIndex = e, f.push(arguments[d - 2], arguments[d - 1]), b.apply(this, f); }; return L.call(this, a, e); } return L.apply(this, arguments); }), "".substr && "b" !== "0b".substr(-1)) { var N = String.prototype.substr; String.prototype.substr = function(a, b) { return N.call(this, a < 0 && (a = this.length + a) < 0 ? 0 :a, b); }; } var O = "\t\n\x0B\f\r   ᠎              \u2028\u2029\ufeff", P = "​"; if (!String.prototype.trim || O.trim() || !P.trim()) { O = "[" + O + "]"; var Q = new RegExp("^" + O + O + "*"), R = new RegExp(O + O + "*$"); String.prototype.trim = function() { if (void 0 === this || null === this) throw new TypeError("can't convert " + this + " to object"); return String(this).replace(Q, "").replace(R, ""); }; } 8 === parseInt(O + "08") && 22 === parseInt(O + "0x16") || (parseInt = function(a) { var b = /^0[xX]/; return function(c, d) { return c = String(c).trim(), Number(d) || (d = b.test(c) ? 16 :10), a(c, d); }; }(parseInt)); var S = function(a) { if (null == a) throw new TypeError("can't convert " + a + " to object"); return Object(a); }; }), function() { function a(b, d) { function f(a) { if (f[a] !== q) return f[a]; var b; if ("bug-string-char-index" == a) b = "a" != "a"[0]; else if ("json" == a) b = f("json-stringify") && f("json-parse"); else { var c, e = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}'; if ("json-stringify" == a) { var i = d.stringify, k = "function" == typeof i && t; if (k) { (c = function() { return 1; }).toJSON = c; try { k = "0" === i(0) && "0" === i(new g()) && '""' == i(new h()) && i(s) === q && i(q) === q && i() === q && "1" === i(c) && "[1]" == i([ c ]) && "[null]" == i([ q ]) && "null" == i(null) && "[null,null,null]" == i([ q, s, null ]) && i({ a:[ c, !0, !1, null, "\0\b\n\f\r\t" ] }) == e && "1" === i(null, c) && "[\n 1,\n 2\n]" == i([ 1, 2 ], null, 1) && '"-271821-04-20T00:00:00.000Z"' == i(new j((-864e13))) && '"+275760-09-13T00:00:00.000Z"' == i(new j(864e13)) && '"-000001-01-01T00:00:00.000Z"' == i(new j((-621987552e5))) && '"1969-12-31T23:59:59.999Z"' == i(new j((-1))); } catch (l) { k = !1; } } b = k; } if ("json-parse" == a) { var m = d.parse; if ("function" == typeof m) try { if (0 === m("0") && !m(!1)) { c = m(e); var n = 5 == c.a.length && 1 === c.a[0]; if (n) { try { n = !m('"\t"'); } catch (l) {} if (n) try { n = 1 !== m("01"); } catch (l) {} if (n) try { n = 1 !== m("1."); } catch (l) {} } } } catch (l) { n = !1; } b = n; } } return f[a] = !!b; } b || (b = e.Object()), d || (d = e.Object()); var g = b.Number || e.Number, h = b.String || e.String, i = b.Object || e.Object, j = b.Date || e.Date, k = b.SyntaxError || e.SyntaxError, l = b.TypeError || e.TypeError, m = b.Math || e.Math, n = b.JSON || e.JSON; "object" == typeof n && n && (d.stringify = n.stringify, d.parse = n.parse); var o, p, q, r = i.prototype, s = r.toString, t = new j((-0xc782b5b800cec)); try { t = t.getUTCFullYear() == -109252 && 0 === t.getUTCMonth() && 1 === t.getUTCDate() && 10 == t.getUTCHours() && 37 == t.getUTCMinutes() && 6 == t.getUTCSeconds() && 708 == t.getUTCMilliseconds(); } catch (u) {} if (!f("json")) { var v = "[object Function]", w = "[object Date]", x = "[object Number]", y = "[object String]", z = "[object Array]", A = "[object Boolean]", B = f("bug-string-char-index"); if (!t) var C = m.floor, D = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ], E = function(a, b) { return D[b] + 365 * (a - 1970) + C((a - 1969 + (b = +(b > 1))) / 4) - C((a - 1901 + b) / 100) + C((a - 1601 + b) / 400); }; if ((o = r.hasOwnProperty) || (o = function(a) { var b, c = {}; return (c.__proto__ = null, c.__proto__ = { toString:1 }, c).toString != s ? o = function(a) { var b = this.__proto__, c = a in (this.__proto__ = null, this); return this.__proto__ = b, c; } :(b = c.constructor, o = function(a) { var c = (this.constructor || b).prototype; return a in this && !(a in c && this[a] === c[a]); }), c = null, o.call(this, a); }), p = function(a, b) { var d, e, f, g = 0; (d = function() { this.valueOf = 0; }).prototype.valueOf = 0, e = new d(); for (f in e) o.call(e, f) && g++; return d = e = null, g ? p = 2 == g ? function(a, b) { var c, d = {}, e = s.call(a) == v; for (c in a) e && "prototype" == c || o.call(d, c) || !(d[c] = 1) || !o.call(a, c) || b(c); } :function(a, b) { var c, d, e = s.call(a) == v; for (c in a) e && "prototype" == c || !o.call(a, c) || (d = "constructor" === c) || b(c); (d || o.call(a, c = "constructor")) && b(c); } :(e = [ "valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor" ], p = function(a, b) { var d, f, g = s.call(a) == v, h = !g && "function" != typeof a.constructor && c[typeof a.hasOwnProperty] && a.hasOwnProperty || o; for (d in a) g && "prototype" == d || !h.call(a, d) || b(d); for (f = e.length; d = e[--f]; h.call(a, d) && b(d)) ; }), p(a, b); }, !f("json-stringify")) { var F = { 92:"\\\\", 34:'\\"', 8:"\\b", 12:"\\f", 10:"\\n", 13:"\\r", 9:"\\t" }, G = "000000", H = function(a, b) { return (G + (b || 0)).slice(-a); }, I = "\\u00", J = function(a) { for (var b = '"', c = 0, d = a.length, e = !B || d > 10, f = e && (B ? a.split("") :a); c < d; c++) { var g = a.charCodeAt(c); switch (g) { case 8: case 9: case 10: case 12: case 13: case 34: case 92: b += F[g]; break; default: if (g < 32) { b += I + H(2, g.toString(16)); break; } b += e ? f[c] :a.charAt(c); } } return b + '"'; }, K = function(a, b, c, d, e, f, g) { var h, i, j, k, m, n, r, t, u, v, B, D, F, G, I, L; try { h = b[a]; } catch (M) {} if ("object" == typeof h && h) if (i = s.call(h), i != w || o.call(h, "toJSON")) "function" == typeof h.toJSON && (i != x && i != y && i != z || o.call(h, "toJSON")) && (h = h.toJSON(a)); else if (h > -1 / 0 && h < 1 / 0) { if (E) { for (m = C(h / 864e5), j = C(m / 365.2425) + 1970 - 1; E(j + 1, 0) <= m; j++) ; for (k = C((m - E(j, 0)) / 30.42); E(j, k + 1) <= m; k++) ; m = 1 + m - E(j, k), n = (h % 864e5 + 864e5) % 864e5, r = C(n / 36e5) % 24, t = C(n / 6e4) % 60, u = C(n / 1e3) % 60, v = n % 1e3; } else j = h.getUTCFullYear(), k = h.getUTCMonth(), m = h.getUTCDate(), r = h.getUTCHours(), t = h.getUTCMinutes(), u = h.getUTCSeconds(), v = h.getUTCMilliseconds(); h = (j <= 0 || j >= 1e4 ? (j < 0 ? "-" :"+") + H(6, j < 0 ? -j :j) :H(4, j)) + "-" + H(2, k + 1) + "-" + H(2, m) + "T" + H(2, r) + ":" + H(2, t) + ":" + H(2, u) + "." + H(3, v) + "Z"; } else h = null; if (c && (h = c.call(b, a, h)), null === h) return "null"; if (i = s.call(h), i == A) return "" + h; if (i == x) return h > -1 / 0 && h < 1 / 0 ? "" + h :"null"; if (i == y) return J("" + h); if ("object" == typeof h) { for (G = g.length; G--; ) if (g[G] === h) throw l(); if (g.push(h), B = [], I = f, f += e, i == z) { for (F = 0, G = h.length; F < G; F++) D = K(F, h, c, d, e, f, g), B.push(D === q ? "null" :D); L = B.length ? e ? "[\n" + f + B.join(",\n" + f) + "\n" + I + "]" :"[" + B.join(",") + "]" :"[]"; } else p(d || h, function(a) { var b = K(a, h, c, d, e, f, g); b !== q && B.push(J(a) + ":" + (e ? " " :"") + b); }), L = B.length ? e ? "{\n" + f + B.join(",\n" + f) + "\n" + I + "}" :"{" + B.join(",") + "}" :"{}"; return g.pop(), L; } }; d.stringify = function(a, b, d) { var e, f, g, h; if (c[typeof b] && b) if ((h = s.call(b)) == v) f = b; else if (h == z) { g = {}; for (var i, j = 0, k = b.length; j < k; i = b[j++], h = s.call(i), (h == y || h == x) && (g[i] = 1)) ; } if (d) if ((h = s.call(d)) == x) { if ((d -= d % 1) > 0) for (e = "", d > 10 && (d = 10); e.length < d; e += " ") ; } else h == y && (e = d.length <= 10 ? d :d.slice(0, 10)); return K("", (i = {}, i[""] = a, i), f, g, e, "", []); }; } if (!f("json-parse")) { var L, M, N = h.fromCharCode, O = { 92:"\\", 34:'"', 47:"/", 98:"\b", 116:"\t", 110:"\n", 102:"\f", 114:"\r" }, P = function() { throw L = M = null, k(); }, Q = function() { for (var a, b, c, d, e, f = M, g = f.length; L < g; ) switch (e = f.charCodeAt(L)) { case 9: case 10: case 13: case 32: L++; break; case 123: case 125: case 91: case 93: case 58: case 44: return a = B ? f.charAt(L) :f[L], L++, a; case 34: for (a = "@", L++; L < g; ) if (e = f.charCodeAt(L), e < 32) P(); else if (92 == e) switch (e = f.charCodeAt(++L)) { case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114: a += O[e], L++; break; case 117: for (b = ++L, c = L + 4; L < c; L++) e = f.charCodeAt(L), e >= 48 && e <= 57 || e >= 97 && e <= 102 || e >= 65 && e <= 70 || P(); a += N("0x" + f.slice(b, L)); break; default: P(); } else { if (34 == e) break; for (e = f.charCodeAt(L), b = L; e >= 32 && 92 != e && 34 != e; ) e = f.charCodeAt(++L); a += f.slice(b, L); } if (34 == f.charCodeAt(L)) return L++, a; P(); default: if (b = L, 45 == e && (d = !0, e = f.charCodeAt(++L)), e >= 48 && e <= 57) { for (48 == e && (e = f.charCodeAt(L + 1), e >= 48 && e <= 57) && P(), d = !1; L < g && (e = f.charCodeAt(L), e >= 48 && e <= 57); L++) ; if (46 == f.charCodeAt(L)) { for (c = ++L; c < g && (e = f.charCodeAt(c), e >= 48 && e <= 57); c++) ; c == L && P(), L = c; } if (e = f.charCodeAt(L), 101 == e || 69 == e) { for (e = f.charCodeAt(++L), 43 != e && 45 != e || L++, c = L; c < g && (e = f.charCodeAt(c), e >= 48 && e <= 57); c++) ; c == L && P(), L = c; } return +f.slice(b, L); } if (d && P(), "true" == f.slice(L, L + 4)) return L += 4, !0; if ("false" == f.slice(L, L + 5)) return L += 5, !1; if ("null" == f.slice(L, L + 4)) return L += 4, null; P(); } return "$"; }, R = function(a) { var b, c; if ("$" == a && P(), "string" == typeof a) { if ("@" == (B ? a.charAt(0) :a[0])) return a.slice(1); if ("[" == a) { for (b = []; a = Q(), "]" != a; c || (c = !0)) c && ("," == a ? (a = Q(), "]" == a && P()) :P()), "," == a && P(), b.push(R(a)); return b; } if ("{" == a) { for (b = {}; a = Q(), "}" != a; c || (c = !0)) c && ("," == a ? (a = Q(), "}" == a && P()) :P()), "," != a && "string" == typeof a && "@" == (B ? a.charAt(0) :a[0]) && ":" == Q() || P(), b[a.slice(1)] = R(Q()); return b; } P(); } return a; }, S = function(a, b, c) { var d = T(a, b, c); d === q ? delete a[b] :a[b] = d; }, T = function(a, b, c) { var d, e = a[b]; if ("object" == typeof e && e) if (s.call(e) == z) for (d = e.length; d--; ) S(e, d, c); else p(e, function(a) { S(e, a, c); }); return c.call(a, b, e); }; d.parse = function(a, b) { var c, d; return L = 0, M = "" + a, c = R(Q()), "$" != Q() && P(), L = M = null, b && s.call(b) == v ? T((d = {}, d[""] = c, d), "", b) :c; }; } } return d.runInContext = a, d; } var b = "function" == typeof define && define.amd, c = { "function":!0, object:!0 }, d = c[typeof exports] && exports && !exports.nodeType && exports, e = c[typeof window] && window || this, f = d && c[typeof module] && module && !module.nodeType && "object" == typeof global && global; if (!f || f.global !== f && f.window !== f && f.self !== f || (e = f), d && !b) a(e, d); else { var g = e.JSON, h = e.JSON3, i = !1, j = a(e, e.JSON3 = { noConflict:function() { return i || (i = !0, e.JSON = g, e.JSON3 = h, g = h = null), j; } }); e.JSON = { parse:j.parse, stringify:j.stringify }; } b && define(function() { return j; }); }.call(this);`) func scriptsOldieshimJsBytes() ([]byte, error) { return _scriptsOldieshimJs, nil } func scriptsOldieshimJs() (*asset, error) { bytes, err := scriptsOldieshimJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "scripts/oldieshim.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _scriptsScriptsJs = []byte(`"use strict"; function ResourceGroupVersion(a, b, c) { return this.resource = a, this.group = b, this.version = c, this; } window.OPENSHIFT_CONSTANTS = { HELP_BASE_URL:"https://docs.openshift.org/latest/", HELP:{ cli:"cli_reference/overview.html", get_started_cli:"cli_reference/get_started_cli.html", basic_cli_operations:"cli_reference/basic_cli_operations.html", "build-triggers":"dev_guide/builds.html#build-triggers", webhooks:"dev_guide/builds.html#webhook-triggers", new_app:"dev_guide/new_app.html", "start-build":"dev_guide/builds.html#starting-a-build", "deployment-operations":"cli_reference/basic_cli_operations.html#build-and-deployment-cli-operations", "route-types":"architecture/core_concepts/routes.html#route-types", persistent_volumes:"dev_guide/persistent_volumes.html", compute_resources:"dev_guide/compute_resources.html", pod_autoscaling:"dev_guide/pod_autoscaling.html", application_health:"dev_guide/application_health.html", source_secrets:"dev_guide/builds.html#using-secrets", git_secret:"dev_guide/builds.html#using-private-repositories-for-builds", pull_secret:"dev_guide/managing_images.html#using-image-pull-secrets", managing_secrets:"dev_guide/service_accounts.html#managing-allowed-secrets", creating_secrets:"dev_guide/secrets.html#creating-and-using-secrets", storage_classes:"install_config/persistent_storage/dynamically_provisioning_pvs.html", selector_label:"install_config/persistent_storage/selector_label_binding.html", rolling_strategy:"dev_guide/deployments/deployment_strategies.html#rolling-strategy", recreate_strategy:"dev_guide/deployments/deployment_strategies.html#recreate-strategy", custom_strategy:"dev_guide/deployments/deployment_strategies.html#custom-strategy", lifecycle_hooks:"dev_guide/deployments/deployment_strategies.html#lifecycle-hooks", new_pod_exec:"dev_guide/deployments/deployment_strategies.html#pod-based-lifecycle-hook", authorization:"architecture/additional_concepts/authorization.html", roles:"architecture/additional_concepts/authorization.html#roles", service_accounts:"dev_guide/service_accounts.html", users_and_groups:"architecture/additional_concepts/authentication.html#users-and-groups", "pipeline-builds":"architecture/core_concepts/builds_and_image_streams.html#pipeline-build", "pipeline-plugin":"using_images/other_images/jenkins.html#openshift-origin-pipeline-plug-in", quota:"dev_guide/compute_resources.html", "config-maps":"dev_guide/configmaps.html", secrets:"dev_guide/secrets.html", deployments:"dev_guide/deployments/how_deployments_work.html", pods:"architecture/core_concepts/pods_and_services.html#pods", services:"architecture/core_concepts/pods_and_services.html#services", routes:"architecture/core_concepts/routes.html", builds:"architecture/core_concepts/builds_and_image_streams.html#builds", "image-streams":"architecture/core_concepts/builds_and_image_streams.html#image-streams", storage:"architecture/additional_concepts/storage.html", "default":"welcome/index.html" }, CLI:{ "Latest Release":"https://github.com/openshift/origin/releases/latest" }, DEFAULT_HPA_CPU_TARGET_PERCENT:80, DISABLE_OVERVIEW_METRICS:!1, DISABLE_WILDCARD_ROUTES:!0, AVAILABLE_KINDS_BLACKLIST:[ "Binding", "Ingress", "DeploymentConfigRollback" ], ENABLE_TECH_PREVIEW_FEATURE:{ pipelines:!0 }, SAMPLE_PIPELINE_TEMPLATE:{ name:"jenkins-pipeline-example", namespace:"openshift" }, CREATE_FROM_URL_WHITELIST:[ "openshift" ], PROJECT_NAVIGATION:[ { label:"Overview", iconClass:"fa fa-dashboard", href:"/overview" }, { label:"Applications", iconClass:"fa fa-cubes", secondaryNavSections:[ { items:[ { label:"Deployments", href:"/browse/deployments", prefixes:[ "/browse/deployment/", "/browse/dc/", "/browse/rs/", "/browse/rc/" ] }, { label:"Pods", href:"/browse/pods", prefixes:[ "/browse/pods/" ] }, { label:"Services", href:"/browse/services", prefixes:[ "/browse/services/" ] }, { label:"Routes", href:"/browse/routes", prefixes:[ "/browse/routes/" ] } ] } ] }, { label:"Builds", iconClass:"pficon pficon-build", secondaryNavSections:[ { items:[ { label:"Builds", href:"/browse/builds", prefixes:[ "/browse/builds/", "/browse/builds-noconfig/" ] }, { label:"Pipelines", href:"/browse/pipelines", prefixes:[ "/browse/pipelines/" ], isValid:function() { return !!_.get(window.OPENSHIFT_CONSTANTS, "ENABLE_TECH_PREVIEW_FEATURE.pipelines"); } }, { label:"Images", href:"/browse/images", prefixes:[ "/browse/images/" ] } ] } ] }, { label:"Resources", iconClass:"fa fa-files-o", secondaryNavSections:[ { items:[ { label:"Quota", href:"/quota" }, { label:"Membership", href:"/membership", canI:{ resource:"rolebindings", verb:"list" } }, { label:"Config Maps", href:"/browse/config-maps", prefixes:[ "/browse/config-maps/" ] }, { label:"Secrets", href:"/browse/secrets", prefixes:[ "/browse/secrets/" ], canI:{ resource:"secrets", verb:"list" } }, { label:"Other Resources", href:"/browse/other" } ] } ] }, { label:"Storage", iconClass:"pficon pficon-container-node", href:"/browse/storage", prefixes:[ "/browse/storage/" ] }, { label:"Monitoring", iconClass:"pficon pficon-screen", href:"/monitoring", prefixes:[ "/browse/events" ] } ], CATALOG_CATEGORIES:[ { id:"languages", label:"Languages", iconClassDefault:"fa fa-code", items:[ { id:"java", label:"Java", iconClass:"font-icon icon-openjdk", subcategories:[ { id:"java-subcategories", items:[ { id:"amq", label:"Red Hat JBoss A-MQ" }, { id:"processserver", label:"Red Hat JBoss BPM Suite" }, { id:"decisionserver", label:"Red Hat JBoss BRMS" }, { id:"datagrid", label:"Red Hat JBoss Data Grid" }, { id:"eap", label:"Red Hat JBoss EAP" }, { id:"jboss-fuse", label:"Red Hat JBoss Fuse" }, { id:"tomcat", label:"Red Hat JBoss Web Server (Tomcat)" }, { id:"sso", label:"Red Hat Single Sign-On" }, { id:"wildfly", label:"WildFly" } ] } ] }, { id:"javascript", categoryAliases:[ "nodejs", "js" ], label:"JavaScript", iconClass:"font-icon icon-js" }, { id:"dotnet", label:".NET", iconClass:"font-icon icon-dotnet" }, { id:"perl", label:"Perl", iconClass:"font-icon icon-perl" }, { id:"php", label:"PHP", iconClass:"font-icon icon-php" }, { id:"python", label:"Python", iconClass:"font-icon icon-python" }, { id:"ruby", label:"Ruby", iconClass:"font-icon icon-ruby" } ] }, { id:"technologies", label:"Technologies", items:[ { id:"business-process-services", categoryAliases:[ "decisionserver", "processserver" ], label:"Business Process Services", description:"Model, automate, and orchestrate business processes across applications, services, and data." }, { id:"ci-cd", categoryAliases:[ "jenkins" ], label:"Continuous Integration & Deployment", description:"Automate the build, test, and deployment of your application with each new code revision." }, { id:"datastore", categoryAliases:[ "database", "datagrid" ], label:"Data Stores", description:"Store and manage collections of data." }, { id:"messaging", label:"Messaging", description:"Facilitate communication between applications and distributed processes with a messaging server." }, { id:"integration", label:"Integration", description:"Connect with other applications and data to enhance functionality without duplication." }, { id:"single-sign-on", categoryAliases:[ "sso" ], label:"Single Sign-On", description:"A centralized authentication server for users to log in, log out, register, and manage user accounts for applications and RESTful web services." }, { id:"", label:"Uncategorized", description:"" } ] } ] }, angular.module("openshiftConsole", [ "ngAnimate", "ngCookies", "ngResource", "ngRoute", "ngSanitize", "openshiftUI", "kubernetesUI", "registryUI.images", "ui.bootstrap", "patternfly.charts", "patternfly.sort", "openshiftConsoleTemplates", "ui.ace", "extension-registry", "as.sortable", "ui.select", "key-value-editor", "angular-inview", "angularMoment", "ab-base64" ]).config([ "$routeProvider", function(a) { a.when("/", { templateUrl:"views/projects.html", controller:"ProjectsController" }).when("/create-project", { templateUrl:"views/create-project.html", controller:"CreateProjectController" }).when("/project/:project", { redirectTo:function(a) { return "/project/" + encodeURIComponent(a.project) + "/overview"; } }).when("/project/:project/overview", { templateUrl:"views/overview.html", controller:"OverviewController" }).when("/project/:project/quota", { templateUrl:"views/quota.html", controller:"QuotaController" }).when("/project/:project/monitoring", { templateUrl:"views/monitoring.html", controller:"MonitoringController", reloadOnSearch:!1 }).when("/project/:project/membership", { templateUrl:"views/membership.html", controller:"MembershipController", reloadOnSearch:!1 }).when("/project/:project/browse", { redirectTo:function(a) { return "/project/" + encodeURIComponent(a.project) + "/browse/pods"; } }).when("/project/:project/browse/builds", { templateUrl:"views/builds.html", controller:"BuildsController", reloadOnSearch:!1 }).when("/project/:project/browse/pipelines", { templateUrl:"views/pipelines.html", controller:"PipelinesController" }).when("/project/:project/browse/builds/:buildconfig", { templateUrl:"views/browse/build-config.html", controller:"BuildConfigController", reloadOnSearch:!1 }).when("/project/:project/browse/pipelines/:buildconfig", { templateUrl:"views/browse/build-config.html", controller:"BuildConfigController", resolve:{ isPipeline:[ "$route", function(a) { a.current.params.isPipeline = !0; } ] } }).when("/project/:project/edit/yaml", { templateUrl:"views/edit/yaml.html", controller:"EditYAMLController" }).when("/project/:project/edit/builds/:buildconfig", { templateUrl:"views/edit/build-config.html", controller:"EditBuildConfigController" }).when("/project/:project/edit/pipelines/:buildconfig", { templateUrl:"views/edit/build-config.html", controller:"EditBuildConfigController", resolve:{ isPipeline:[ "$route", function(a) { a.current.params.isPipeline = !0; } ] }, reloadOnSearch:!1 }).when("/project/:project/browse/builds/:buildconfig/:build", { templateUrl:function(a) { return "chromeless" === a.view ? "views/logs/chromeless-build-log.html" :"views/browse/build.html"; }, controller:"BuildController", reloadOnSearch:!1 }).when("/project/:project/browse/pipelines/:buildconfig/:build", { templateUrl:"views/browse/build.html", controller:"BuildController", resolve:{ isPipeline:[ "$route", function(a) { a.current.params.isPipeline = !0; } ] }, reloadOnSearch:!1 }).when("/project/:project/browse/builds-noconfig/:build", { templateUrl:"views/browse/build.html", controller:"BuildController", reloadOnSearch:!1 }).when("/project/:project/browse/pipelines-noconfig/:build", { templateUrl:"views/browse/build.html", controller:"BuildController", resolve:{ isPipeline:[ "$route", function(a) { a.current.params.isPipeline = !0; } ] }, reloadOnSearch:!1 }).when("/project/:project/browse/deployments", { templateUrl:"views/deployments.html", controller:"DeploymentsController", reloadOnSearch:!1 }).when("/project/:project/browse/deployment/:deployment", { templateUrl:"views/browse/deployment.html", controller:"DeploymentController", reloadOnSearch:!1 }).when("/project/:project/browse/dc/:deploymentconfig", { templateUrl:"views/browse/deployment-config.html", controller:"DeploymentConfigController", reloadOnSearch:!1 }).when("/project/:project/edit/dc/:deploymentconfig", { templateUrl:"views/edit/deployment-config.html", controller:"EditDeploymentConfigController" }).when("/project/:project/browse/rs/:replicaSet", { templateUrl:"views/browse/replica-set.html", resolve:{ kind:function() { return "ReplicaSet"; } }, controller:"ReplicaSetController", reloadOnSearch:!1 }).when("/project/:project/browse/rc/:replicaSet", { templateUrl:function(a) { return "chromeless" === a.view ? "views/logs/chromeless-deployment-log.html" :"views/browse/replica-set.html"; }, resolve:{ kind:function() { return "ReplicationController"; } }, controller:"ReplicaSetController", reloadOnSearch:!1 }).when("/project/:project/browse/events", { templateUrl:"views/events.html", controller:"EventsController" }).when("/project/:project/browse/images", { templateUrl:"views/images.html", controller:"ImagesController", reloadOnSearch:!1 }).when("/project/:project/browse/images/:imagestream", { templateUrl:"views/browse/imagestream.html", controller:"ImageStreamController" }).when("/project/:project/browse/images/:imagestream/:tag", { templateUrl:"views/browse/image.html", controller:"ImageController", reloadOnSearch:!1 }).when("/project/:project/browse/pods", { templateUrl:"views/pods.html", controller:"PodsController", reloadOnSearch:!1 }).when("/project/:project/browse/pods/:pod", { templateUrl:function(a) { return "chromeless" === a.view ? "views/logs/chromeless-pod-log.html" :"views/browse/pod.html"; }, controller:"PodController", reloadOnSearch:!1 }).when("/project/:project/browse/services", { templateUrl:"views/services.html", controller:"ServicesController", reloadOnSearch:!1 }).when("/project/:project/browse/services/:service", { templateUrl:"views/browse/service.html", controller:"ServiceController", reloadOnSearch:!1 }).when("/project/:project/browse/storage", { templateUrl:"views/storage.html", controller:"StorageController", reloadOnSearch:!1 }).when("/project/:project/browse/secrets/:secret", { templateUrl:"views/browse/secret.html", controller:"SecretController", reloadOnSearch:!1 }).when("/project/:project/browse/secrets", { templateUrl:"views/secrets.html", controller:"SecretsController", reloadOnSearch:!1 }).when("/project/:project/create-secret", { templateUrl:"views/create-secret.html", controller:"CreateSecretController" }).when("/project/:project/browse/config-maps", { templateUrl:"views/browse/config-maps.html", controller:"ConfigMapsController", reloadOnSearch:!1 }).when("/project/:project/browse/config-maps/:configMap", { templateUrl:"views/browse/config-map.html", controller:"ConfigMapController" }).when("/project/:project/create-config-map", { templateUrl:"views/create-config-map.html", controller:"CreateConfigMapController" }).when("/project/:project/edit/config-maps/:configMap", { templateUrl:"views/edit/config-map.html", controller:"EditConfigMapController" }).when("/project/:project/browse/other", { templateUrl:"views/other-resources.html", controller:"OtherResourcesController", reloadOnSearch:!1 }).when("/project/:project/browse/persistentvolumeclaims/:pvc", { templateUrl:"views/browse/persistent-volume-claim.html", controller:"PersistentVolumeClaimController" }).when("/project/:project/browse/routes", { templateUrl:"views/browse/routes.html", controller:"RoutesController", reloadOnSearch:!1 }).when("/project/:project/edit/routes/:route", { templateUrl:"views/edit/route.html", controller:"EditRouteController" }).when("/project/:project/browse/routes/:route", { templateUrl:"views/browse/route.html", controller:"RouteController" }).when("/project/:project/create-route", { templateUrl:"views/create-route.html", controller:"CreateRouteController" }).when("/project/:project/edit", { templateUrl:"views/edit/project.html", controller:"EditProjectController" }).when("/project/:project/create-pvc", { templateUrl:"views/create-persistent-volume-claim.html", controller:"CreatePersistentVolumeClaimController" }).when("/project/:project/attach-pvc", { templateUrl:"views/attach-pvc.html", controller:"AttachPVCController" }).when("/project/:project/add-config-volume", { templateUrl:"views/add-config-volume.html", controller:"AddConfigVolumeController" }).when("/project/:project/create", { templateUrl:"views/create.html", controller:"CreateController", reloadOnSearch:!1 }).when("/project/:project/create/category/:category", { templateUrl:"views/create/category.html", controller:"BrowseCategoryController" }).when("/project/:project/create/category/:category/:subcategory", { templateUrl:"views/create/category.html", controller:"BrowseCategoryController" }).when("/project/:project/create/fromtemplate", { templateUrl:"views/newfromtemplate.html", controller:"NewFromTemplateController" }).when("/project/:project/create/fromimage", { templateUrl:"views/create/fromimage.html", controller:"CreateFromImageController" }).when("/project/:project/create/next", { templateUrl:"views/create/next-steps.html", controller:"NextStepsController" }).when("/project/:project/set-limits", { templateUrl:"views/set-limits.html", controller:"SetLimitsController" }).when("/project/:project/edit/autoscaler", { templateUrl:"views/edit/autoscaler.html", controller:"EditAutoscalerController" }).when("/project/:project/edit/health-checks", { templateUrl:"views/edit/health-checks.html", controller:"EditHealthChecksController" }).when("/about", { templateUrl:"views/about.html", controller:"AboutController" }).when("/command-line", { templateUrl:"views/command-line.html", controller:"CommandLineController" }).when("/oauth", { templateUrl:"views/util/oauth.html", controller:"OAuthController" }).when("/error", { templateUrl:"views/util/error.html", controller:"ErrorController" }).when("/logout", { templateUrl:"views/util/logout.html", controller:"LogoutController" }).when("/create", { templateUrl:"views/create-from-url.html", controller:"CreateFromURLController" }).when("/createProject", { redirectTo:"/create-project" }).when("/project/:project/createRoute", { redirectTo:"/project/:project/create-route" }).when("/project/:project/attachPVC", { redirectTo:"/project/:project/attach-pvc" }).when("/project/:project/browse/deployments/:deploymentconfig", { redirectTo:"/project/:project/browse/dc/:deploymentconfig" }).when("/project/:project/browse/deployments/:deploymentconfig/:rc", { redirectTo:"/project/:project/browse/rc/:rc" }).when("/project/:project/browse/deployments-replicationcontrollers/:rc", { redirectTo:"/project/:project/browse/rc/:rc" }).otherwise({ redirectTo:"/" }); } ]).constant("API_CFG", _.get(window.OPENSHIFT_CONFIG, "api", {})).constant("APIS_CFG", _.get(window.OPENSHIFT_CONFIG, "apis", {})).constant("AUTH_CFG", _.get(window.OPENSHIFT_CONFIG, "auth", {})).constant("LOGGING_URL", _.get(window.OPENSHIFT_CONFIG, "loggingURL")).constant("METRICS_URL", _.get(window.OPENSHIFT_CONFIG, "metricsURL")).constant("LIMIT_REQUEST_OVERRIDES", _.get(window.OPENSHIFT_CONFIG, "limitRequestOverrides")).constant("BREAKPOINTS", { screenXsMin:480, screenSmMin:768, screenMdMin:992, screenLgMin:1200, screenXlgMin:1600 }).constant("SOURCE_URL_PATTERN", /^[a-z][a-z0-9+.-@]*:(\/\/)?[0-9a-z_-]+/i).constant("IS_IOS", /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream).constant("amTimeAgoConfig", { titleFormat:"LLL" }).config([ "$httpProvider", "AuthServiceProvider", "RedirectLoginServiceProvider", "AUTH_CFG", "API_CFG", "kubernetesContainerSocketProvider", function(a, b, c, d, e, f) { a.interceptors.push("AuthInterceptor"), b.LoginService("RedirectLoginService"), b.LogoutService("DeleteTokenLogoutService"), b.UserStore("LocalStorageUserStore"), c.OAuthClientID(d.oauth_client_id), c.OAuthAuthorizeURI(d.oauth_authorize_uri), c.OAuthRedirectURI(URI(d.oauth_redirect_base).segment("oauth").toString()), f.WebSocketFactory = "ContainerWebSocket"; } ]).config([ "$compileProvider", function(a) { a.aHrefSanitizationWhitelist(/^\s*(https?|mailto|git):/i); } ]).run([ "$rootScope", "LabelFilter", function(a, b) { b.persistFilterState(!0), a.$on("$routeChangeSuccess", function() { b.readPersistedState(); }); } ]).run([ "durationFilter", "timeOnlyDurationFromTimestampsFilter", function(a, b) { setInterval(function() { $(".duration[data-timestamp]").text(function(c, d) { var e = $(this).data("timestamp"), f = $(this).data("omit-single"), g = $(this).data("precision"), h = $(this).data("time-only"); return h ? b(e, null) || d :a(e, null, f, g) || d; }); }, 1e3); } ]).run([ "IS_IOS", function(a) { a && $("body").addClass("ios"); } ]), hawtioPluginLoader.addModule("openshiftConsole"), hawtioPluginLoader.registerPreBootstrapTask(function(a) { if (_.get(window, "OPENSHIFT_CONFIG.api.k8s.resources")) return void a(); var b = { k8s:{}, openshift:{} }, c = {}, d = [], e = window.location.protocol + "//", f = e + window.OPENSHIFT_CONFIG.api.k8s.hostPort + window.OPENSHIFT_CONFIG.api.k8s.prefix, g = $.get(f + "/v1").done(function(a) { b.k8s.v1 = _.indexBy(a.resources, "name"); }).fail(function(a, b, c) { d.push({ data:a, textStatus:b, xhr:c }); }), h = e + window.OPENSHIFT_CONFIG.api.openshift.hostPort + window.OPENSHIFT_CONFIG.api.openshift.prefix, i = $.get(h + "/v1").done(function(a) { b.openshift.v1 = _.indexBy(a.resources, "name"); }).fail(function(a, b, c) { d.push({ data:a, textStatus:b, xhr:c }); }), j = e + window.OPENSHIFT_CONFIG.apis.hostPort + window.OPENSHIFT_CONFIG.apis.prefix, k = $.get(j).then(function(a) { var b = []; return _.each(a.groups, function(a) { var e = { name:a.name, preferredVersion:a.preferredVersion.version, versions:{} }; c[e.name] = e, _.each(a.versions, function(a) { var c = a.version; e.versions[c] = { version:c, groupVersion:a.groupVersion }, b.push($.get(j + "/" + a.groupVersion).done(function(a) { e.versions[c].resources = _.indexBy(a.resources, "name"); }).fail(function(a, b, c) { d.push({ data:a, textStatus:b, xhr:c }); })); }); }), $.when.apply(this, b); }, function(a, b, c) { d.push({ data:a, textStatus:b, xhr:c }); }), l = function() { window.OPENSHIFT_CONFIG.api.k8s.resources = b.k8s, window.OPENSHIFT_CONFIG.api.openshift.resources = b.openshift, window.OPENSHIFT_CONFIG.apis.groups = c, d.length && (window.OPENSHIFT_CONFIG.apis.API_DISCOVERY_ERRORS = d), a(); }; $.when(g, i, k).always(l); }), angular.module("openshiftConsole").provider("Logger", function() { this.$get = function() { var a = Logger.get("OpenShift"), b = { get:function(a) { var b = Logger.get("OpenShift/" + a), c = "OFF"; return localStorage && (c = localStorage["OpenShiftLogLevel." + a] || c), b.setLevel(Logger[c]), b; }, log:function() { a.log.apply(a, arguments); }, info:function() { a.info.apply(a, arguments); }, debug:function() { a.debug.apply(a, arguments); }, warn:function() { a.warn.apply(a, arguments); }, error:function() { a.error.apply(a, arguments); } }, c = "ERROR"; return localStorage && (c = localStorage["OpenShiftLogLevel.main"] || c), a.setLevel(Logger[c]), b; }; }), angular.module("openshiftConsole").factory("base64util", function() { return { pad:function(a) { if (!a) return ""; switch (a.length % 4) { case 1: return a + "==="; case 2: return a + "=="; case 3: return a + "="; default: return a; } } }; }), angular.module("openshiftConsole").provider("$ws", [ "$httpProvider", function(a) { this.$get = [ "$q", "$injector", "Logger", function(b, c, d) { var e = d.get("auth"); e.log("$wsProvider.$get", arguments); var f = []; angular.forEach(a.interceptors, function(a) { angular.isString(a) ? f.unshift(c.get(a)) :f.unshift(c.invoke(a)); }); var g = function(a) { a.method = angular.uppercase(a.method || "WATCH"), e.log("$ws (pre-intercept)", a.url.toString()); var c = function(a) { e.log("$ws (post-intercept)", a.url.toString()); var b = new WebSocket(a.url, a.protocols); return a.onclose && (b.onclose = a.onclose), a.onmessage && (b.onmessage = a.onmessage), a.onopen && (b.onopen = a.onopen), a.onerror && (b.onerror = a.onerror), b; }, d = [ c, void 0 ], g = b.when(a); for (angular.forEach(f, function(a) { (a.request || a.requestError) && d.unshift(a.request, a.requestError); }); d.length; ) { var h = d.shift(), i = d.shift(); g = g.then(h, i); } return g; }; return g.available = function() { try { return !!WebSocket; } catch (a) { return !1; } }, g; } ]; } ]).factory("ContainerWebSocket", [ "API_CFG", "$ws", function(a, b) { return function(c, d) { var e; return 0 === c.indexOf("/") && (e = "http:" === window.location.protocol ? "ws://" :"wss://", c = e + a.openshift.hostPort + c), b({ url:c, method:"WATCH", protocols:d, auth:{} }); }; } ]), angular.module("openshiftConsole").provider("MemoryUserStore", function() { this.$get = [ "Logger", function(a) { var b = a.get("auth"), c = null, d = null; return { available:function() { return !0; }, getUser:function() { return b.log("MemoryUserStore.getUser", c), c; }, setUser:function(a, d) { b.log("MemoryUserStore.setUser", a), c = a; }, getToken:function() { return b.log("MemoryUserStore.getToken", d), d; }, setToken:function(a, c) { b.log("MemoryUserStore.setToken", a), d = a; } }; } ]; }).provider("SessionStorageUserStore", function() { this.$get = [ "Logger", function(a) { var b = a.get("auth"), c = "SessionStorageUserStore.user", d = "SessionStorageUserStore.token"; return { available:function() { try { var a = String(new Date().getTime()); sessionStorage["SessionStorageUserStore.test"] = a; var b = sessionStorage["SessionStorageUserStore.test"]; return sessionStorage.removeItem("SessionStorageUserStore.test"), a === b; } catch (c) { return !1; } }, getUser:function() { try { var a = JSON.parse(sessionStorage[c]); return b.log("SessionStorageUserStore.getUser", a), a; } catch (d) { return b.error("SessionStorageUserStore.getUser", d), null; } }, setUser:function(a, d) { a ? (b.log("SessionStorageUserStore.setUser", a), sessionStorage[c] = JSON.stringify(a)) :(b.log("SessionStorageUserStore.setUser", a, "deleting"), sessionStorage.removeItem(c)); }, getToken:function() { try { var a = sessionStorage[d]; return b.log("SessionStorageUserStore.getToken", a), a; } catch (c) { return b.error("SessionStorageUserStore.getToken", c), null; } }, setToken:function(a, c) { a ? (b.log("SessionStorageUserStore.setToken", a), sessionStorage[d] = a) :(b.log("SessionStorageUserStore.setToken", a, "deleting"), sessionStorage.removeItem(d)); } }; } ]; }).provider("LocalStorageUserStore", function() { this.$get = [ "Logger", function(a) { var b = a.get("auth"), c = "LocalStorageUserStore.user", d = "LocalStorageUserStore.token", e = function(a) { return a + ".ttl"; }, f = function(a, c) { if (c) { var d = new Date().getTime() + 1e3 * c; localStorage[e(a)] = d, b.log("LocalStorageUserStore.setTTL", a, c, new Date(d).toString()); } else localStorage.removeItem(e(a)), b.log("LocalStorageUserStore.setTTL deleting", a); }, g = function(a) { var c = localStorage[e(a)]; if (!c) return !1; var d = parseInt(c) < new Date().getTime(); return b.log("LocalStorageUserStore.isTTLExpired", a, d), d; }; return { available:function() { try { var a = String(new Date().getTime()); localStorage["LocalStorageUserStore.test"] = a; var b = localStorage["LocalStorageUserStore.test"]; return localStorage.removeItem("LocalStorageUserStore.test"), a === b; } catch (c) { return !1; } }, getUser:function() { try { if (g(c)) return b.log("LocalStorageUserStore.getUser expired"), localStorage.removeItem(c), f(c, null), null; var a = JSON.parse(localStorage[c]); return b.log("LocalStorageUserStore.getUser", a), a; } catch (d) { return b.error("LocalStorageUserStore.getUser", d), null; } }, setUser:function(a, d) { a ? (b.log("LocalStorageUserStore.setUser", a, d), localStorage[c] = JSON.stringify(a), f(c, d)) :(b.log("LocalStorageUserStore.setUser", a, "deleting"), localStorage.removeItem(c), f(c, null)); }, getToken:function() { try { if (g(d)) return b.log("LocalStorageUserStore.getToken expired"), localStorage.removeItem(d), f(d, null), null; var a = localStorage[d]; return b.log("LocalStorageUserStore.getToken", a), a; } catch (c) { return b.error("LocalStorageUserStore.getToken", c), null; } }, setToken:function(a, c) { a ? (b.log("LocalStorageUserStore.setToken", a, c), localStorage[d] = a, f(d, c)) :(b.log("LocalStorageUserStore.setToken", a, c, "deleting"), localStorage.removeItem(d), f(d, null)); } }; } ]; }), ResourceGroupVersion.prototype.toString = function() { var a = this.resource; return this.group && (a += "/" + this.group), this.version && (a += "/" + this.version), a; }, ResourceGroupVersion.prototype.primaryResource = function() { if (!this.resource) return ""; var a = this.resource.indexOf("/"); return a === -1 ? this.resource :this.resource.substring(0, a); }, ResourceGroupVersion.prototype.subresources = function() { var a = (this.resource || "").split("/"); return a.shift(), a; }, ResourceGroupVersion.prototype.equals = function(a, b, c) { return this.resource === a && (1 === arguments.length || this.group === b && (2 === arguments.length || this.version === c)); }, angular.module("openshiftConsole").factory("APIService", [ "API_CFG", "APIS_CFG", "AuthService", "Constants", "Logger", "$q", "$http", "$filter", "$window", function(a, b, c, d, e, f, g, h, i) { function j(a) { if (!a) return a; var b = a.indexOf("/"); return b === -1 ? a.toLowerCase() :a.substring(0, b).toLowerCase() + a.substring(b); } function k(a, b) { if (!a) return ""; var c = a; if (b) { var d = h("humanizeKind"); c = d(c); } return c = String(c).toLowerCase(), "endpoints" === c || "securitycontextconstraints" === c || ("s" === c[c.length - 1] ? c += "es" :"y" === c[c.length - 1] ? c = c.substring(0, c.length - 1) + "ies" :c += "s"), c; } var l = { "":"v1", extensions:"v1beta1" }, m = function(a) { if (a instanceof ResourceGroupVersion) return a; var c, d, e; return angular.isString(a) ? (c = j(a), d = "", e = l[d]) :a && a.resource && (c = j(a.resource), d = a.group || "", e = a.version || l[d] || _.get(b, [ "groups", d, "preferredVersion" ])), new ResourceGroupVersion(c, d, e); }, n = function(a) { if (a) { var b = a.split("/"); return 1 === b.length ? "v1" === b[0] ? { group:"", version:b[0] } :{ group:b[0], version:"" } :2 === b.length ? { group:b[0], version:b[1] } :void e.warn('Invalid apiVersion "' + a + '"'); } }, o = function(a) { if (a && a.kind && a.apiVersion) { var b = k(a.kind); if (b) { var c = n(a.apiVersion); if (c) return new ResourceGroupVersion(b, c.group, c.version); } } }, p = function(a, b) { if (a && b) { var c = k(b.kind), d = n(b.apiVersion), e = m(a); if (c && d && e) return angular.isString(a) ? (e.equals(c) && (e.group = d.group, e.version = d.version), e) :(e.equals(c, d.group) && (e.version = d.version), e); } }, q = function(d) { if (b.API_DISCOVERY_ERRORS) { var e = _.every(b.API_DISCOVERY_ERRORS, function(a) { return 0 === _.get(a, "data.status"); }); return e && !c.isLoggedIn() ? void c.withUser() :void (i.location.href = URI("error").query({ error_description:"Unable to load details about the server. If the problem continues, please contact your system administrator.", error:"API_DISCOVERY" }).toString()); } d = m(d); var f = d.primaryResource(); if (d.group) { if (!_.get(b, [ "groups", d.group, "versions", d.version, "resources", f ])) return; return { hostPort:b.hostPort, prefix:b.prefix, group:d.group, version:d.version }; } var g; for (var h in a) if (g = a[h], _.get(g, [ "resources", d.version, f ])) return { hostPort:g.hostPort, prefix:g.prefix, version:d.version }; }, r = function(a) { var b = "", c = ""; return a && a.kind && (b = a.kind), a && a.apiVersion && (c = a.apiVersion), "Invalid kind (" + b + ") or API version (" + c + ")"; }, s = function(a) { var b = "", c = ""; return a && a.kind && (b = a.kind), a && a.apiVersion && (c = a.apiVersion), "The API version " + c + " for kind " + b + " is not supported by this server"; }, t = function(c) { var e = [], f = d.AVAILABLE_KINDS_BLACKLIST; return _.each(a, function(a) { _.each(a.resources.v1, function(a) { if (a.namespaced || c) { if (a.name.indexOf("/") >= 0 || _.contains(f, a.kind)) return; e.push({ kind:a.kind }); } }); }), _.each(b.groups, function(a) { var b = l[a.name] || a.preferredVersion; _.each(a.versions[b].resources, function(b) { b.name.indexOf("/") >= 0 || _.contains(f, b.kind) || "autoscaling" === a.name && "HorizontalPodAutoscaler" === b.kind || "batch" === a.name && "Job" === b.kind || (b.namespaced || c) && e.push({ kind:b.kind, group:a.name }); }); }), _.uniq(e, !1, function(a) { return a.group + "/" + a.kind; }); }, u = t(!1), v = t(!0), w = function(a) { return a ? v :u; }; return { toResourceGroupVersion:m, parseGroupVersion:n, objectToResourceGroupVersion:o, deriveTargetResource:p, kindToResource:k, apiInfo:q, invalidObjectKindOrVersion:r, unsupportedObjectKindOrVersion:s, availableKinds:w }; } ]), angular.module("openshiftConsole").provider("AuthService", function() { var a = ""; this.UserStore = function(b) { return b && (a = b), a; }; var b = ""; this.LoginService = function(a) { return a && (b = a), b; }; var c = ""; this.LogoutService = function(a) { return a && (c = a), c; }; var d = function(a, b, c) { if (b) return angular.isString(b) ? a.get(b) :a.invoke(b); throw c + " not set"; }; this.$get = [ "$q", "$injector", "$log", "$rootScope", "Logger", function(e, f, g, h, i) { var j = i.get("auth"); j.log("AuthServiceProvider.$get", arguments); var k = $.Callbacks(), l = $.Callbacks(), m = $.Callbacks(), n = null, o = null, p = d(f, a, "AuthServiceProvider.UserStore()"); p.available() || i.error("AuthServiceProvider.$get user store " + a + " not available"); var q = d(f, b, "AuthServiceProvider.LoginService()"), r = d(f, c, "AuthServiceProvider.LogoutService()"); return { UserStore:function() { return p; }, isLoggedIn:function() { return !!p.getUser(); }, withUser:function() { var a = p.getUser(); return a ? (h.user = a, j.log("AuthService.withUser()", a), e.when(a)) :(j.log("AuthService.withUser(), calling startLogin()"), this.startLogin()); }, setUser:function(a, b, c) { j.log("AuthService.setUser()", a, b, c); var d = p.getUser(); p.setUser(a, c), p.setToken(b, c), h.user = a; var e = d && d.metadata && d.metadata.name, f = a && a.metadata && a.metadata.name; e !== f && (j.log("AuthService.setUser(), user changed", d, a), m.fire(a)); }, requestRequiresAuth:function(a) { var b = !!a.auth; return j.log("AuthService.requestRequiresAuth()", a.url.toString(), b), b; }, addAuthToRequest:function(a) { var b = ""; return a && a.auth && a.auth.token ? (b = a.auth.token, j.log("AuthService.addAuthToRequest(), using token from request config", b)) :(b = p.getToken(), j.log("AuthService.addAuthToRequest(), using token from user store", b)), b ? ("WATCH" === a.method ? (a.url = URI(a.url).addQuery({ access_token:b }).toString(), j.log("AuthService.addAuthToRequest(), added token param", a.url)) :(a.headers.Authorization = "Bearer " + b, j.log("AuthService.addAuthToRequest(), added token header", a.headers.Authorization)), !0) :(j.log("AuthService.addAuthToRequest(), no token available"), !1); }, startLogin:function() { if (n) return j.log("Login already in progress"), n; var a = this; return n = q.login().then(function(b) { a.setUser(b.user, b.token, b.ttl), k.fire(b.user); })["catch"](function(a) { i.error(a); })["finally"](function() { n = null; }); }, startLogout:function() { if (o) return j.log("Logout already in progress"), o; var a = this, b = p.getUser(), c = p.getToken(), d = this.isLoggedIn(); return o = r.logout(b, c).then(function() { j.log("Logout service success"); })["catch"](function(a) { j.error("Logout service error", a); })["finally"](function() { a.setUser(null, null); var b = a.isLoggedIn(); d && !b && l.fire(), o = null; }); }, onLogin:function(a) { k.add(a); }, onLogout:function(a) { l.add(a); }, onUserChanged:function(a) { m.add(a); } }; } ]; }).factory("AuthInterceptor", [ "$q", "AuthService", function(a, b) { var c = []; return { request:function(d) { if (!b.requestRequiresAuth(d)) return d; if (b.addAuthToRequest(d)) return d; if (d.auth && d.auth.triggerLogin === !1) return d; var e = a.defer(); return c.push([ e, d, "request" ]), b.startLogin(), e.promise; }, responseError:function(d) { var e = d.config.auth || {}; if (!b.requestRequiresAuth(d.config)) return a.reject(d); if (e.triggerLogin === !1) return a.reject(d); var f = d.status; switch (f) { case 401: var g = a.defer(); return c.push([ g, d.config, "responseError" ]), b.startLogin(), g.promise; default: return a.reject(d); } } }; } ]), angular.module("openshiftConsole").factory("AuthorizationService", [ "$q", "$cacheFactory", "Logger", "$interval", "APIService", "DataService", function(a, b, c, d, e, f) { var g = null, h = b("rulesCache", { number:10 }), i = !1, j = [ "localresourceaccessreviews", "localsubjectaccessreviews", "resourceaccessreviews", "selfsubjectrulesreviews", "subjectaccessreviews" ], k = function(a) { var b = {}; return _.each(a, function(a) { _.each(a.apiGroups, function(c) { b[c] || (b[c] = {}), _.each(a.resources, function(d) { b[c][d] = a.verbs; }); }); }), b; }, l = function(a) { return "projectrequests" !== a && !_.contains(a, "/") && !_.contains(j, a); }, m = function(a) { return _.some(a, function(a) { return _.some(a.resources, function(b) { return l(b) && !_.isEmpty(_.intersection(a.verbs, [ "*", "create", "update" ])); }); }); }, n = function(b) { var d = a.defer(); g = b; var j = h.get(b), l = "selfsubjectrulesreviews"; if (!j || j.forceRefresh) if (e.apiInfo(l)) { c.log("AuthorizationService, loading user rules for " + b + " project"); var n = { kind:"SelfSubjectRulesReview", apiVersion:"v1" }; f.create(l, null, n, { namespace:b }).then(function(a) { var c = k(a.status.rules), e = m(a.status.rules); h.put(b, { rules:c, canAddToProject:e, forceRefresh:!1, cacheTimestamp:_.now() }), d.resolve(); }, function() { i = !0, d.resolve(); }); } else c.log("AuthorizationService, resource 'selfsubjectrulesreviews' is not part of APIserver. Switching into permissive mode."), i = !0, d.resolve(); else c.log("AuthorizationService, using cached rules for " + b + " project"), _.now() - j.cacheTimestamp >= 6e5 && (j.forceRefresh = !0), d.resolve(); return d.promise; }, o = function(a) { return _.get(h.get(a || g), [ "rules" ]); }, p = function(a, b, c, d) { var e = a[c]; if (!e) return !1; var f = e[d]; return !!f && (_.contains(f, b) || _.contains(f, "*")); }, q = function(a, b, c) { if (i) return !0; var d = e.toResourceGroupVersion(a), f = o(c || g); return !!f && (p(f, b, d.group, d.resource) || p(f, b, "*", "*") || p(f, b, d.group, "*") || p(f, b, "*", d.resource)); }, r = function(a) { return !!i || !!_.get(h.get(a || g), [ "canAddToProject" ]); }; return { checkResource:l, getProjectRules:n, canI:q, canIAddToProject:r, getRulesForProject:o }; } ]), angular.module("openshiftConsole").factory("DataService", [ "$cacheFactory", "$http", "$ws", "$rootScope", "$q", "API_CFG", "APIService", "Notification", "Logger", "$timeout", "base64", "base64util", function(a, b, c, d, e, f, g, h, i, j, k, l) { function m(a) { this._data = {}, this._objectsByAttribute(a, "metadata.name", this._data); } function n(a, b, c, d) { for (var e = b.split("."), f = a, g = 0; g < e.length; g++) if (f = f[e[g]], void 0 === f) return; if ($.isArray(f)) ; else if ($.isPlainObject(f)) for (var h in f) { var i = f[h]; c[h] || (c[h] = {}), "DELETED" === d ? delete c[h][i] :c[h][i] = a; } else "DELETED" === d ? delete c[f] :c[f] = a; } function o() { this._listDeferredMap = {}, this._watchCallbacksMap = {}, this._watchObjectCallbacksMap = {}, this._watchOperationMap = {}, this._listOperationMap = {}, this._resourceVersionMap = {}, this._dataCache = a("dataCache", { number:25 }), this._immutableDataCache = a("immutableDataCache", { number:50 }), this._watchOptionsMap = {}, this._watchWebsocketsMap = {}, this._watchPollTimeoutsMap = {}, this._websocketEventsMap = {}; var b = this; d.$on("$routeChangeStart", function(a, c, d) { b._websocketEventsMap = {}; }); } function p(a) { var b = 3e4; return a.length >= r && Date.now() - a[0].time < b; } function q(a) { var b = 5; if (a.length < b) return !1; for (var c = a.length - b; c < a.length; c++) if ("close" !== a[c].type) return !1; return !0; } m.prototype.by = function(a) { if ("metadata.name" === a) return this._data; var b = {}; for (var c in this._data) n(this._data[c], a, b, null); return b; }, m.prototype.update = function(a, b) { n(a, "metadata.name", this._data, b); }, m.prototype._objectsByAttribute = function(a, b, c, d) { angular.forEach(a, function(a, e) { n(a, b, c, d ? d[e] :null); }); }, o.prototype.list = function(a, b, c, d) { a = g.toResourceGroupVersion(a); var e = this._uniqueKey(a, null, b, _.get(d, "http.params")), f = this._listDeferred(e); return c && f.promise.then(c), this._isCached(e) ? f.resolve(this._data(e)) :this._listInFlight(e) || this._startListOp(a, b, d), f.promise; }, o.prototype["delete"] = function(a, c, d, f) { a = g.toResourceGroupVersion(a), f = f || {}; var h, i = e.defer(), j = this, k = {}; return _.has(f, "gracePeriodSeconds") && (h = { kind:"DeleteOptions", apiVersion:"v1", gracePeriodSeconds:f.gracePeriodSeconds }, k["Content-Type"] = "application/json"), this._getNamespace(a, d, f).then(function(e) { b(angular.extend({ method:"DELETE", auth:{}, data:h, headers:k, url:j._urlForResource(a, c, d, !1, e) }, f.http || {})).success(function(a, b, c, d, e) { i.resolve(a); }).error(function(a, b, c, d) { i.reject({ data:a, status:b, headers:c, config:d }); }); }), i.promise; }, o.prototype.update = function(a, c, d, f, h) { a = g.deriveTargetResource(a, d), h = h || {}; var i = e.defer(), j = this; return this._getNamespace(a, f, h).then(function(e) { b(angular.extend({ method:"PUT", auth:{}, data:d, url:j._urlForResource(a, c, f, !1, e) }, h.http || {})).success(function(a, b, c, d, e) { i.resolve(a); }).error(function(a, b, c, d) { i.reject({ data:a, status:b, headers:c, config:d }); }); }), i.promise; }, o.prototype.create = function(a, c, d, f, h) { a = g.deriveTargetResource(a, d), h = h || {}; var i = e.defer(), j = this; return this._getNamespace(a, f, h).then(function(e) { b(angular.extend({ method:"POST", auth:{}, data:d, url:j._urlForResource(a, c, f, !1, e) }, h.http || {})).success(function(a, b, c, d, e) { i.resolve(a); }).error(function(a, b, c, d) { i.reject({ data:a, status:b, headers:c, config:d }); }); }), i.promise; }, o.prototype.batch = function(a, b, c, d) { function f() { 0 === l && h.resolve({ success:i, failure:j }); } var h = e.defer(), i = [], j = [], k = this, l = a.length; return c = c || "create", _.each(a, function(a) { var e = g.objectToResourceGroupVersion(a); if (!e) return j.push({ object:a, data:{ message:g.invalidObjectKindOrVersion(a) } }), l--, void f(); if (!g.apiInfo(e)) return j.push({ object:a, data:{ message:g.unsupportedObjectKindOrVersion(a) } }), l--, void f(); var m = function(b) { b.object = a, i.push(b), l--, f(); }, n = function(b) { b.object = a, j.push(b), l--, f(); }; switch (c) { case "create": k.create(e, null, a, b, d).then(m, n); break; case "update": k.update(e, a.metadata.name, a, b, d).then(m, n); break; default: return h.reject({ data:"Invalid '" + c + "' action.", status:400, headers:function() { return null; }, config:{}, object:a }); } }), h.promise; }, o.prototype.get = function(a, c, d, f) { a = g.toResourceGroupVersion(a), f = f || {}; var i = this._uniqueKey(a, c, d, _.get(f, "http.params")); !!f.force; delete f.force; var k = e.defer(), l = this._immutableData(i); if (this._hasImmutable(a, l, c)) j(function() { k.resolve(l.by("metadata.name")[c]); }, 0); else { var m = this; this._getNamespace(a, d, f).then(function(e) { b(angular.extend({ method:"GET", auth:{}, url:m._urlForResource(a, c, d, !1, e) }, f.http || {})).success(function(b, c, d, e, f) { m._isImmutable(a) && (l ? l.update(b, "ADDED") :m._immutableData(i, [ b ])), k.resolve(b); }).error(function(b, d, e, g) { if (f.errorNotification !== !1) { var i = "Failed to get " + a + "/" + c; 0 !== d && (i += " (" + d + ")"), h.error(i); } k.reject({ data:b, status:d, headers:e, config:g }); }); }); } return k.promise; }, o.prototype.createStream = function(a, b, d, e, f) { var h = this; a = g.toResourceGroupVersion(a); var j, m = f ? "binary.k8s.io" :"base64.binary.k8s.io", n = "stream_", o = {}, p = {}, q = {}, r = {}, s = function() { return h._getNamespace(a, d, {}).then(function(g) { var j = 0; return c({ url:h._urlForResource(a, b, d, !0, _.extend(g, e)), auth:{}, onopen:function(a) { _.each(o, function(b) { b(a); }); }, onmessage:function(a) { if (!_.isString(a.data)) return void i.log("log stream response is not a string", a.data); var b; f || (b = k.decode(l.pad(a.data)), j += b.length), _.each(p, function(c) { f ? c(a.data) :c(b, a.data, j); }); }, onclose:function(a) { _.each(q, function(b) { b(a); }); }, onerror:function(a) { _.each(r, function(b) { b(a); }); }, protocols:m }).then(function(a) { return i.log("Streaming pod log", a), a; }); }); }; return { onOpen:function(a) { if (_.isFunction(a)) { var b = _.uniqueId(n); return o[b] = a, b; } }, onMessage:function(a) { if (_.isFunction(a)) { var b = _.uniqueId(n); return p[b] = a, b; } }, onClose:function(a) { if (_.isFunction(a)) { var b = _.uniqueId(n); return q[b] = a, b; } }, onError:function(a) { if (_.isFunction(a)) { var b = _.uniqueId(n); return r[b] = a, b; } }, remove:function(a) { o[a] && delete o[a], p[a] && delete p[a], q[a] && delete q[a], r[a] && delete r[a]; }, start:function() { return j = s(); }, stop:function() { j.then(function(a) { a.close(); }); } }; }, o.prototype.watch = function(a, b, c, d) { a = g.toResourceGroupVersion(a), d = d || {}; var e = this._uniqueKey(a, null, b, _.get(d, "http.params")); if (c) this._watchCallbacks(e).add(c); else if (!this._watchCallbacks(e).has()) return {}; var f = this._watchOptions(e); if (f) { if (!!f.poll != !!d.poll) throw "A watch already exists for " + a + " with a different polling option."; } else this._watchOptions(e, d); var h = this; if (this._isCached(e)) c && j(function() { c(h._data(e)); }, 0); else { if (c) { var i = this._resourceVersion(e); this._data(e) && j(function() { i === h._resourceVersion(e) && c(h._data(e)); }, 0); } this._listInFlight(e) || this._startListOp(a, b, d); } return { resource:a, context:b, callback:c, opts:d }; }, o.prototype.watchObject = function(a, b, c, d, e) { a = g.toResourceGroupVersion(a), e = e || {}; var f, h = this._uniqueKey(a, b, c, _.get(e, "http.params")); if (d) { this._watchObjectCallbacks(h).add(d); var i = this; f = function(a, c, d) { if (d && d.metadata.name === b) i._watchObjectCallbacks(h).fire(d, c); else if (!d) { var e = a.by("metadata.name"); e[b] && i._watchObjectCallbacks(h).fire(e[b]); } }; } else if (!this._watchObjectCallbacks(h).has()) return {}; var j = this.watch(a, c, f, e); return j.objectCallback = d, j.objectName = b, j; }, o.prototype.unwatch = function(a) { var b = a.resource, c = a.objectName, d = a.context, e = a.callback, f = a.objectCallback, g = a.opts, h = this._uniqueKey(b, null, d, _.get(g, "http.params")); if (f && c) { var i = this._uniqueKey(b, c, d, _.get(g, "http.params")), j = this._watchObjectCallbacks(i); j.remove(f); } var k = this._watchCallbacks(h); if (e && k.remove(e), !k.has()) { if (g && g.poll) clearTimeout(this._watchPollTimeouts(h)), this._watchPollTimeouts(h, null); else if (this._watchWebsockets(h)) { var l = this._watchWebsockets(h); l.shouldClose = !0, l.close(), this._watchWebsockets(h, null); } this._watchInFlight(h, !1), this._watchOptions(h, null); } }, o.prototype.unwatchAll = function(a) { for (var b = 0; b < a.length; b++) this.unwatch(a[b]); }, o.prototype._watchCallbacks = function(a) { return this._watchCallbacksMap[a] || (this._watchCallbacksMap[a] = $.Callbacks()), this._watchCallbacksMap[a]; }, o.prototype._watchObjectCallbacks = function(a) { return this._watchObjectCallbacksMap[a] || (this._watchObjectCallbacksMap[a] = $.Callbacks()), this._watchObjectCallbacksMap[a]; }, o.prototype._listDeferred = function(a) { return this._listDeferredMap[a] || (this._listDeferredMap[a] = e.defer()), this._listDeferredMap[a]; }, o.prototype._watchInFlight = function(a, b) { return b || b === !1 ? void (this._watchOperationMap[a] = b) :this._watchOperationMap[a]; }, o.prototype._listInFlight = function(a, b) { return b || b === !1 ? void (this._listOperationMap[a] = b) :this._listOperationMap[a]; }, o.prototype._resourceVersion = function(a, b) { return b ? void (this._resourceVersionMap[a] = b) :this._resourceVersionMap[a]; }, o.prototype._data = function(a, b) { return b ? this._dataCache.put(a, new m(b)) :this._dataCache.get(a); }, o.prototype._immutableData = function(a, b) { return b ? this._immutableDataCache.put(a, new m(b)) :this._immutableDataCache.get(a); }, o.prototype._isCached = function(a) { return this._watchInFlight(a) && this._resourceVersion(a) && !!this._data(a); }, o.prototype._watchOptions = function(a, b) { return void 0 === b ? this._watchOptionsMap[a] :void (this._watchOptionsMap[a] = b); }, o.prototype._watchPollTimeouts = function(a, b) { return b ? void (this._watchPollTimeoutsMap[a] = b) :this._watchPollTimeoutsMap[a]; }, o.prototype._watchWebsockets = function(a, b) { return b ? void (this._watchWebsocketsMap[a] = b) :this._watchWebsocketsMap[a]; }; var r = 10; o.prototype._addWebsocketEvent = function(a, b) { var c = this._websocketEventsMap[a]; for (c || (c = this._websocketEventsMap[a] = []), c.push({ type:b, time:Date.now() }); c.length > r; ) c.shift(); }, o.prototype._isTooManyWebsocketRetries = function(a) { var b = this._websocketEventsMap[a]; return !!b && (p(b) ? (i.log("Too many websocket open or close events for resource/context in a short period", a, b), !0) :!!q(b) && (i.log("Too many consecutive websocket close events for resource/context", a, b), !0)); }; var s = function(a) { var b = _.keysIn(_.pick(a, [ "fieldSelector", "labelSelector" ])).sort(); return _.reduce(b, function(c, d, e) { return c + d + "=" + encodeURIComponent(a[d]) + (e < b.length - 1 ? "&" :""); }, "?"); }; o.prototype._uniqueKey = function(a, b, c, d) { var e = c && c.namespace || _.get(c, "project.metadata.name") || c.projectName; return this._urlForResource(a, b, c, null, angular.extend({}, {}, { namespace:e })).toString() + s(d || {}); }, o.prototype._startListOp = function(a, c, d) { d = d || {}; var e = this._uniqueKey(a, null, c, _.get(d, "http.params")); this._listInFlight(e, !0); var f = this; c.projectPromise && !a.equals("projects") ? c.projectPromise.done(function(g) { b(angular.extend({ method:"GET", auth:{}, url:f._urlForResource(a, null, c, !1, { namespace:g.metadata.name }) }, d.http || {})).success(function(b, g, h, i, j) { f._listOpComplete(e, a, c, d, b); }).error(function(b, c, g, i) { f._listInFlight(e, !1); var j = f._listDeferred(e); if (delete f._listDeferredMap[e], j.reject(b, c, g, i), _.get(d, "errorNotification", !0)) { var k = "Failed to list " + a; 0 !== c && (k += " (" + c + ")"), h.error(k); } }); }) :b({ method:"GET", auth:{}, url:this._urlForResource(a, null, c) }).success(function(b, g, h, i, j) { f._listOpComplete(e, a, c, d, b); }).error(function(b, c, g, i) { f._listInFlight(e, !1); var j = f._listDeferred(e); if (delete f._listDeferredMap[e], j.reject(b, c, g, i), _.get(d, "errorNotification", !0)) { var k = "Failed to list " + a; 0 !== c && (k += " (" + c + ")"), h.error(k); } }); }, o.prototype._listOpComplete = function(a, b, c, d, e) { e.items || console.warn("List request for " + b + " returned a null items array. This is an invalid API response."); var f = e.items || []; e.kind && e.kind.indexOf("List") === e.kind.length - 4 && angular.forEach(f, function(a) { a.kind || (a.kind = e.kind.slice(0, -4)), a.apiVersion || (a.apiVersion = e.apiVersion); }), this._listInFlight(a, !1); var g = this._listDeferred(a); if (delete this._listDeferredMap[a], this._resourceVersion(a, e.resourceVersion || e.metadata.resourceVersion), this._data(a, f), g.resolve(this._data(a)), this._watchCallbacks(a).fire(this._data(a)), this._watchCallbacks(a).has()) { var h = this._watchOptions(a) || {}; h.poll ? (this._watchInFlight(a, !0), this._watchPollTimeouts(a, setTimeout($.proxy(this, "_startListOp", b, c), h.pollInterval || 5e3))) :this._watchInFlight(a) || this._startWatchOp(a, b, c, d, this._resourceVersion(a)); } }, o.prototype._startWatchOp = function(a, b, d, e, f) { if (this._watchInFlight(a, !0), c.available()) { var g = this, h = _.get(e, "http.params") || {}; h.watch = !0, f && (h.resourceVersion = f), d.projectPromise && !b.equals("projects") ? d.projectPromise.done(function(f) { h.namespace = f.metadata.name, c({ method:"WATCH", url:g._urlForResource(b, null, d, !0, h), auth:{}, onclose:$.proxy(g, "_watchOpOnClose", b, d, e), onmessage:$.proxy(g, "_watchOpOnMessage", b, d, e), onopen:$.proxy(g, "_watchOpOnOpen", b, d, e) }).then(function(b) { i.log("Watching", b), g._watchWebsockets(a, b); }); }) :c({ method:"WATCH", url:g._urlForResource(b, null, d, !0, h), auth:{}, onclose:$.proxy(g, "_watchOpOnClose", b, d, e), onmessage:$.proxy(g, "_watchOpOnMessage", b, d, e), onopen:$.proxy(g, "_watchOpOnOpen", b, d, e) }).then(function(b) { i.log("Watching", b), g._watchWebsockets(a, b); }); } }, o.prototype._watchOpOnOpen = function(a, b, c, d) { i.log("Websocket opened for resource/context", a, b); var e = this._uniqueKey(a, null, b, _.get(c, "http.params")); this._addWebsocketEvent(e, "open"); }, o.prototype._watchOpOnMessage = function(a, b, c, d) { var e = this._uniqueKey(a, null, b, _.get(c, "http.params")); try { var f = $.parseJSON(d.data); if ("ERROR" == f.type) return i.log("Watch window expired for resource/context", a, b), void (d.target && (d.target.shouldRelist = !0)); "DELETED" === f.type && f.object && f.object.metadata && !f.object.metadata.deletionTimestamp && (f.object.metadata.deletionTimestamp = new Date().toISOString()), f.object && this._resourceVersion(e, f.object.resourceVersion || f.object.metadata.resourceVersion), this._data(e).update(f.object, f.type); var g = this; j(function() { g._watchCallbacks(e).fire(g._data(e), f.type, f.object); }, 0); } catch (h) { i.error("Error processing message", a, d.data); } }, o.prototype._watchOpOnClose = function(a, b, c, d) { var e = d.target, f = this._uniqueKey(a, null, b, _.get(c, "http.params")); if (!e) return void i.log("Skipping reopen, no eventWS in event", d); var g = this._watchWebsockets(f); if (!g) return void i.log("Skipping reopen, no registeredWS for resource/context", a, b); if (e !== g) return void i.log("Skipping reopen, eventWS does not match registeredWS", e, g); if (this._watchInFlight(f, !1), e.shouldClose) return void i.log("Skipping reopen, eventWS was explicitly closed", e); if (d.wasClean) return void i.log("Skipping reopen, clean close", d); if (!this._watchCallbacks(f).has()) return void i.log("Skipping reopen, no listeners registered for resource/context", a, b); if (this._isTooManyWebsocketRetries(f)) return void (_.get(c, "errorNotification", !0) && h.error("Server connection interrupted.", { id:"websocket_retry_halted", mustDismiss:!0, actions:{ refresh:{ label:"Refresh", action:function() { window.location.reload(); } } } })); if (this._addWebsocketEvent(f, "close"), e.shouldRelist) { i.log("Relisting for resource/context", a, b); var j = this; return void setTimeout(function() { j.watch(a, b); }, 2e3); } i.log("Rewatching for resource/context", a, b), this._watchInFlight(f, !0), setTimeout($.proxy(this, "_startWatchOp", f, a, b, c, this._resourceVersion(f)), 2e3); }; var t = "{protocol}://{+hostPort}{+prefix}{/group}/{version}/", u = t + "{resource}{?q*}", v = t + "{resource}/{name}{/subresource*}{?q*}", w = t + "namespaces/{namespace}/{resource}{?q*}", x = t + "namespaces/{namespace}/{resource}/{name}{/subresource*}{?q*}"; o.prototype._urlForResource = function(a, b, c, d, e) { var f = g.apiInfo(a); if (!f) return i.error("_urlForResource called with unknown resource", a, arguments), null; var h; e = e || {}, h = d ? "http:" === window.location.protocol ? "ws" :"wss" :"http:" === window.location.protocol ? "http" :"https", c && c.namespace && !e.namespace && (e.namespace = c.namespace); var j = e.namespace, k = null; j && (k = e.namespace, e = angular.copy(e), delete e.namespace); var l, m = { protocol:h, hostPort:f.hostPort, prefix:f.prefix, group:f.group, version:f.version, resource:a.primaryResource(), subresource:a.subresources(), name:b, namespace:k, q:e }; return l = b ? j ? x :v :j ? w :u, URI.expand(l, m).toString(); }, o.prototype.url = function(a) { if (a && a.resource) { var b = angular.copy(a); delete b.resource, delete b.group, delete b.version, delete b.name, delete b.isWebsocket; var c = g.toResourceGroupVersion({ resource:a.resource, group:a.group, version:a.version }); return this._urlForResource(c, a.name, null, !!a.isWebsocket, b); } return null; }, o.prototype.openshiftAPIBaseUrl = function() { var a = "http:" === window.location.protocol ? "http" :"https", b = f.openshift.hostPort; return new URI({ protocol:a, hostname:b }).toString(); }; var y = { imagestreamimages:!0 }; return o.prototype._isImmutable = function(a) { return !!y[a.resource]; }, o.prototype._hasImmutable = function(a, b, c) { return this._isImmutable(a) && b && b.by("metadata.name")[c]; }, o.prototype._getNamespace = function(a, b, c) { var d = e.defer(); return c.namespace ? d.resolve({ namespace:c.namespace }) :b.projectPromise && !a.equals("projects") ? b.projectPromise.done(function(a) { d.resolve({ namespace:a.metadata.name }); }) :d.resolve(null), d.promise; }, new o(); } ]), angular.module("openshiftConsole").factory("APIDiscovery", [ "LOGGING_URL", "METRICS_URL", "$q", function(a, b, c) { return { getLoggingURL:function() { return c.when(a); }, getMetricsURL:function() { return c.when(b); } }; } ]), angular.module("openshiftConsole").factory("ProjectsService", [ "$location", "$q", "$routeParams", "AuthService", "DataService", "annotationNameFilter", "AuthorizationService", function(a, b, c, d, e, f, g) { var h = function(a) { var b = [ f("description"), f("displayName") ]; return _.each(b, function(b) { a.metadata.annotations[b] || delete a.metadata.annotations[b]; }), a; }; return { get:function(b) { return d.withUser().then(function() { var c = { projectPromise:$.Deferred(), projectName:b, project:void 0 }; return e.get("projects", b, c, { errorNotification:!1 }).then(function(a) { return g.getProjectRules(b).then(function() { return c.project = a, c.projectPromise.resolve(a), [ a, c ]; }); }, function(b) { c.projectPromise.reject(b); var d = "The project could not be loaded.", e = "error"; 403 === b.status ? (d = "The project " + c.projectName + " does not exist or you are not authorized to view it.", e = "access_denied") :404 === b.status && (d = "The project " + c.projectName + " does not exist.", e = "not_found"), a.url(URI("error").query({ error:e, error_description:d }).toString()); }); }); }, update:function(a, b) { return e.update("projects", a, h(b), { projectName:a }, { errorNotification:!1 }); }, canCreate:function() { return e.get("projectrequests", null, {}, { errorNotification:!1 }); } }; } ]), angular.module("openshiftConsole").service("ApplicationGenerator", [ "DataService", "APIService", "Logger", "$parse", "$q", function(a, b, c, d, e) { var f = {}; return f._generateSecret = function() { function a() { return Math.floor(65536 * (1 + Math.random())).toString(16).substring(1); } return a() + a() + a() + a(); }, f.parsePorts = function(a) { var b = function(b) { var e = []; return angular.forEach(b, function(b, f) { var g = f.split("/"); 1 === g.length && g.push("tcp"); var h = parseInt(g[0], 10); isNaN(h) ? c.warn("Container port " + g[0] + " is not a number for image " + d("metadata.name")(a)) :e.push({ containerPort:h, protocol:g[1].toUpperCase() }); }), e.sort(function(a, b) { return a.containerPort - b.containerPort; }), e; }, e = d("dockerImageMetadata.Config.ExposedPorts")(a) || d("dockerImageMetadata.ContainerConfig.ExposedPorts")(a) || []; return b(e); }, f.generate = function(a) { var b = f.parsePorts(a.image); a.annotations["openshift.io/generated-by"] = "OpenShiftWebConsole"; var c; null !== a.buildConfig.sourceUrl && (c = { name:a.name, tag:"latest", kind:"ImageStreamTag", toString:function() { return this.name + ":" + this.tag; } }); var d = { imageStream:f._generateImageStream(a), buildConfig:f._generateBuildConfig(a, c, a.labels), deploymentConfig:f._generateDeploymentConfig(a, c, b, a.labels) }; a.scaling.autoscale && (d.hpa = f._generateHPA(a, d.deploymentConfig)); var e = f._generateService(a, a.name, b); return e && (d.service = e, d.route = f._generateRoute(a, a.name, d.service.metadata.name)), d; }, f.createRoute = function(a, b, c) { return f._generateRoute({ labels:c || {}, routing:angular.extend({ include:!0 }, a) }, a.name, b); }, f._generateRoute = function(a, b, c) { if (!a.routing.include) return null; var d = { kind:"Route", apiVersion:"v1", metadata:{ name:b, labels:a.labels, annotations:a.annotations }, spec:{ to:{ kind:"Service", name:c }, wildcardPolicy:"None" } }, e = a.routing.host; e && (e.startsWith("*.") ? (d.spec.wildcardPolicy = "Subdomain", d.spec.host = "wildcard" + e.substring(1)) :d.spec.host = e), a.routing.path && (d.spec.path = a.routing.path), a.routing.targetPort && (d.spec.port = { targetPort:a.routing.targetPort }); var f = a.routing.tls; return f && f.termination && (d.spec.tls = { termination:f.termination }, "passthrough" !== f.termination && ("edge" === f.termination && f.insecureEdgeTerminationPolicy && (d.spec.tls.insecureEdgeTerminationPolicy = f.insecureEdgeTerminationPolicy), f.certificate && (d.spec.tls.certificate = f.certificate), f.key && (d.spec.tls.key = f.key), f.caCertificate && (d.spec.tls.caCertificate = f.caCertificate), f.destinationCACertificate && "reencrypt" === f.termination && (d.spec.tls.destinationCACertificate = f.destinationCACertificate))), d; }, f._generateDeploymentConfig = function(a, b, c) { var d = []; angular.forEach(a.deploymentConfig.envVars, function(a, b) { d.push({ name:b, value:a }); }); var e = angular.copy(a.labels); e.deploymentconfig = a.name; var f, g = { image:b.toString(), name:a.name, ports:c, env:d, resources:_.get(a, "container.resources") }; f = a.scaling.autoscaling ? a.scaling.minReplicas || 1 :a.scaling.replicas; var h = { apiVersion:"v1", kind:"DeploymentConfig", metadata:{ name:a.name, labels:a.labels, annotations:a.annotations }, spec:{ replicas:f, selector:{ deploymentconfig:a.name }, triggers:[], template:{ metadata:{ labels:e }, spec:{ containers:[ g ] } } } }; return h.spec.triggers.push({ type:"ImageChange", imageChangeParams:{ automatic:!!a.deploymentConfig.deployOnNewImage, containerNames:[ a.name ], from:{ kind:b.kind, name:b.toString() } } }), a.deploymentConfig.deployOnConfigChange && h.spec.triggers.push({ type:"ConfigChange" }), h; }, f._generateHPA = function(a, b) { var c = { apiVersion:"extensions/v1beta1", kind:"HorizontalPodAutoscaler", metadata:{ name:a.name, labels:a.labels, annotations:a.annotations }, spec:{ scaleRef:{ kind:"DeploymentConfig", name:b.metadata.name, apiVersion:"extensions/v1beta1", subresource:"scale" }, minReplicas:a.scaling.minReplicas, maxReplicas:a.scaling.maxReplicas, cpuUtilization:{ targetPercentage:a.scaling.targetCPU || a.scaling.defaultTargetCPU } } }; return c; }, f._generateBuildConfig = function(a, b) { var c = []; angular.forEach(a.buildConfig.envVars, function(a, b) { c.push({ name:b, value:a }); }); var d = [ { generic:{ secret:f._generateSecret() }, type:"Generic" } ]; a.buildConfig.buildOnSourceChange && d.push({ github:{ secret:f._generateSecret() }, type:"GitHub" }), a.buildConfig.buildOnImageChange && d.push({ imageChange:{}, type:"ImageChange" }), a.buildConfig.buildOnConfigChange && d.push({ type:"ConfigChange" }); var e = new URI(a.buildConfig.sourceUrl), g = e.fragment(); g || (g = "master"), e.fragment(""); var h = e.href(), i = { apiVersion:"v1", kind:"BuildConfig", metadata:{ name:a.name, labels:a.labels, annotations:a.annotations }, spec:{ output:{ to:{ name:b.toString(), kind:b.kind } }, source:{ git:{ ref:a.buildConfig.gitRef || g, uri:h }, type:"Git" }, strategy:{ type:"Source", sourceStrategy:{ from:{ kind:"ImageStreamTag", name:a.imageName + ":" + a.imageTag, namespace:a.namespace }, env:c } }, triggers:d } }; return _.get(a, "buildConfig.secrets.gitSecret[0].name") && (i.spec.source.sourceSecret = _.first(a.buildConfig.secrets.gitSecret)), a.buildConfig.contextDir && (i.spec.source.contextDir = a.buildConfig.contextDir), i; }, f._generateImageStream = function(a) { return { apiVersion:"v1", kind:"ImageStream", metadata:{ name:a.name, labels:a.labels, annotations:a.annotations } }; }, f.getServicePort = function(a) { return { port:a.containerPort, targetPort:a.containerPort, protocol:a.protocol, name:(a.containerPort + "-" + a.protocol).toLowerCase() }; }, f._generateService = function(a, b, c) { if (!c || !c.length) return null; var d = { kind:"Service", apiVersion:"v1", metadata:{ name:b, labels:a.labels, annotations:a.annotations }, spec:{ selector:{ deploymentconfig:a.name }, ports:_.map(c, f.getServicePort) } }; return d; }, f.ifResourcesDontExist = function(c, d) { function f() { 0 === j && (h.length > 0 ? g.reject({ nameTaken:!0 }) :g.resolve({ nameTaken:!1 })); } var g = e.defer(), h = [], i = [], j = c.length; return c.forEach(function(c) { var e = b.objectToResourceGroupVersion(c); return e ? b.apiInfo(e) ? void a.get(e, c.metadata.name, { namespace:d }, { errorNotification:!1 }).then(function(a) { h.push(a), j--, f(); }, function(a) { i.push(a), j--, f(); }) :(i.push({ data:{ message:b.unsupportedObjectKindOrVersion(c) } }), j--, void f()) :(i.push({ data:{ message:b.invalidObjectKindOrVersion(c) } }), j--, void f()); }), g.promise; }, f; } ]), angular.module("openshiftConsole").service("AlertMessageService", function() { var a = [], b = function(a, b) { return b ? "hide/alert/" + b + "/" + a :"hide/alert/" + a; }; return { addAlert:function(b) { a.push(b); }, getAlerts:function() { return a; }, clearAlerts:function() { a = []; }, isAlertPermanentlyHidden:function(a, c) { var d = b(a, c); return "true" === localStorage.getItem(d); }, permanentlyHideAlert:function(a, c) { var d = b(a, c); localStorage.setItem(d, "true"); } }; }), angular.module("openshiftConsole").provider("RedirectLoginService", function() { var a = "", b = "", c = ""; this.OAuthClientID = function(b) { return b && (a = b), a; }, this.OAuthAuthorizeURI = function(a) { return a && (b = a), b; }, this.OAuthRedirectURI = function(a) { return a && (c = a), c; }, this.$get = [ "$location", "$q", "Logger", "base64", function(d, e, f, g) { var h = f.get("auth"), i = function(a) { var b; if (window.crypto && window.Uint32Array) try { var c = new Uint32Array(a); window.crypto.getRandomValues(c), b = []; for (var d = 0; d < a; d++) b.push(c[d]); } catch (e) { h.debug("RedirectLoginService.getRandomInts: ", e), b = null; } if (!b) { b = []; for (var f = 0; f < a; f++) b.push(Math.floor(4294967296 * Math.random())); } return b; }, j = "RedirectLoginService.nonce", k = function(a) { var b = String(new Date().getTime()) + "-" + i(8).join(""); try { window.localStorage[j] = b; } catch (c) { h.log("RedirectLoginService.makeState, localStorage error: ", c); } return g.urlencode(JSON.stringify({ then:a, nonce:b })); }, l = function(a) { var b = { then:null, verified:!1 }, c = ""; try { c = window.localStorage[j], window.localStorage.removeItem(j); } catch (d) { h.log("RedirectLoginService.parseState, localStorage error: ", d); } try { var e = a ? JSON.parse(g.urldecode(a)) :{}; e && e.nonce && c && e.nonce === c && (b.verified = !0, b.then = e.then); } catch (d) { h.error("RedirectLoginService.parseState, state error: ", d); } return h.error("RedirectLoginService.parseState", b), b; }; return { login:function() { if ("" === a) return e.reject({ error:"invalid_request", error_description:"RedirectLoginServiceProvider.OAuthClientID() not set" }); if ("" === b) return e.reject({ error:"invalid_request", error_description:"RedirectLoginServiceProvider.OAuthAuthorizeURI() not set" }); if ("" === c) return e.reject({ error:"invalid_request", error_description:"RedirectLoginServiceProvider.OAuthRedirectURI not set" }); var f = e.defer(), g = new URI(b), i = new URI(d.url()).fragment(""); return g.query({ client_id:a, response_type:"token", state:k(i.toString()), redirect_uri:c }), h.log("RedirectLoginService.login(), redirecting", g.toString()), window.location.href = g.toString(), f.promise; }, finish:function() { var a = new URI(d.url()), b = a.query(!0), c = new URI("?" + a.fragment()).query(!0); h.log("RedirectLoginService.finish()", b, c); var f = b.error || c.error; if (f) { var g = b.error_description || c.error_description, i = b.error_uri || c.error_uri; return h.log("RedirectLoginService.finish(), error", f, g, i), e.reject({ error:f, error_description:g, error_uri:i }); } var j = l(c.state); if (c.access_token && "bearer" === (c.token_type || "").toLowerCase()) { var k = e.defer(); return k.resolve({ token:c.access_token, ttl:c.expires_in, then:j.then, verified:j.verified }), k.promise; } return e.reject({ error:"invalid_request", error_description:"No API token returned" }); } }; } ]; }), angular.module("openshiftConsole").provider("DeleteTokenLogoutService", function() { this.$get = [ "$q", "$injector", "Logger", function(a, b, c) { var d = c.get("auth"); return { logout:function(c, e) { if (d.log("DeleteTokenLogoutService.logout()", c, e), !e) return d.log("DeleteTokenLogoutService, no token, returning immediately"), a.when({}); var f = b.get("DataService"), g = { http:{ auth:{ token:e, triggerLogin:!1 } } }; return f["delete"]("oauthaccesstokens", e, {}, g); } }; } ]; }), angular.module("openshiftConsole").service("Navigate", [ "$location", "$window", "$timeout", "annotationFilter", "LabelFilter", "$filter", "APIService", function(a, b, c, d, e, f, g) { var h = f("annotation"), i = f("buildConfigForBuild"), j = f("isJenkinsPipelineStrategy"), k = f("displayName"), l = function(a, b) { return _.get(b, "isPipeline") ? "pipelines" :_.isObject(a) && j(a) ? "pipelines" :"builds"; }; return { toErrorPage:function(c, d, e) { var f = URI("error").query({ error_description:c, error:d }).toString(); e ? b.location.href = f :a.url(f).replace(); }, toProjectOverview:function(b) { a.path(this.projectOverviewURL(b)); }, projectOverviewURL:function(a) { return "project/" + encodeURIComponent(a) + "/overview"; }, createFromImageURL:function(a, b, c, d) { var e = URI.expand("project/{project}/create/fromimage{?q*}", { project:c, q:angular.extend({ imageStream:a.metadata.name, imageTag:b, namespace:a.metadata.namespace, displayName:k(a) }, d || {}) }); return e.toString(); }, createFromTemplateURL:function(a, b, c) { var d = URI.expand("project/{project}/create/fromtemplate{?q*}", { project:b, q:angular.extend({ template:a.metadata.name, namespace:a.metadata.namespace }, c || {}) }); return d.toString(); }, toNextSteps:function(b, c, d) { var e = a.search(); e.name = b, _.isObject(d) && _.extend(e, d), a.path("project/" + encodeURIComponent(c) + "/create/next").search(e); }, toPodsForDeployment:function(b) { a.url("/project/" + b.metadata.namespace + "/browse/pods"), c(function() { e.setLabelSelector(new LabelSelector(b.spec.selector, (!0))); }, 1); }, resourceURL:function(a, b, c, d, e) { if (d = d || "browse", !(a && (a.metadata || b && c))) return null; b || (b = a.kind), c || (c = a.metadata.namespace); var h = a; a.metadata && (h = a.metadata.name); var i = URI("").segment("project").segmentCoded(c).segment(d); switch (b) { case "Build": var j = f("buildConfigForBuild")(a), k = l(a, e); j ? i.segment(k).segmentCoded(j).segmentCoded(h) :i.segment(k + "-noconfig").segmentCoded(h); break; case "BuildConfig": i.segment(l(a, e)).segmentCoded(h); break; case "ConfigMap": i.segment("config-maps").segmentCoded(h); break; case "Deployment": i.segment("deployment").segmentCoded(h); break; case "DeploymentConfig": i.segment("dc").segmentCoded(h); break; case "ReplicaSet": i.segment("rs").segmentCoded(h); break; case "ReplicationController": i.segment("rc").segmentCoded(h); break; case "ImageStream": i.segment("images").segmentCoded(h); break; case "ImageStreamTag": var m = h.indexOf(":"); i.segment("images").segmentCoded(h.substring(0, m)).segmentCoded(h.substring(m + 1)); break; case "PersistentVolumeClaim": case "Pod": case "Route": case "Secret": case "Service": i.segment(g.kindToResource(b)).segmentCoded(h); break; default: var n; if (a.metadata) n = g.objectToResourceGroupVersion(a); else if (_.get(e, "apiVersion")) { var o = g.kindToResource(b), p = g.parseGroupVersion(e.apiVersion); p.resource = o, n = g.toResourceGroupVersion(p); } else n = g.toResourceGroupVersion(g.kindToResource(b)); var q = g.apiInfo(n); if (!q) return null; i.segment("other").search({ kind:b, group:n.group }); } return i.toString(); }, toResourceURL:function(b) { a.url(this.resourceURL(b)); }, configURLForResource:function(a, b) { var c, d, e = _.get(a, "kind"), f = _.get(a, "metadata.namespace"); if (!e || !f) return null; switch (e) { case "Build": return c = i(a), c ? this.resourceURL(c, "BuildConfig", f, b, { isPipeline:j(a) }) :null; case "ReplicationController": return d = h(a, "deploymentConfig"), d ? this.resourceURL(d, "DeploymentConfig", f, b) :null; } return null; }, resourceListURL:function(a, b) { var c = { builds:"builds", buildconfigs:"builds", configmaps:"config-maps", deployments:"deployments", deploymentconfigs:"deployments", imagestreams:"images", pods:"pods", replicasets:"deployments", replicationcontrollers:"deployments", routes:"routes", secrets:"secrets", services:"services", persistentvolumeclaims:"storage" }; return URI.expand("project/{projectName}/browse/{browsePath}", { projectName:b, browsePath:c[a] }).toString(); }, toResourceList:function(b, c) { a.url(this.resourceListURL(b, c)); }, yamlURL:function(a, b) { if (!a) return ""; var c = g.parseGroupVersion(a.apiVersion); return URI.expand("project/{projectName}/edit/yaml?kind={kind}&name={name}&group={group}&returnURL={returnURL}", { projectName:a.metadata.namespace, kind:a.kind, name:a.metadata.name, group:c.group || "", returnURL:b || "" }).toString(); }, healthCheckURL:function(a, b, c, d) { return URI.expand("project/{projectName}/edit/health-checks?kind={kind}&name={name}&group={group}", { projectName:a, kind:b, name:c, group:d || "" }).toString(); } }; } ]), angular.module("openshiftConsole").service("NameGenerator", function() { return { suggestFromSourceUrl:function(a) { var b = a.substr(a.lastIndexOf("/") + 1, a.length), c = b.indexOf("."); return c !== -1 && (b = b.substr(0, c)), b.split("#")[0]; } }; }), angular.module("openshiftConsole").factory("TaskList", [ "$timeout", function(a) { function b() { this.tasks = []; } var c = 6e4, d = new b(); return b.prototype.add = function(b, e, f, g) { var h = { status:"started", titles:b, helpLinks:e, namespace:f }; this.tasks.push(h), g().then(function(b) { h.status = "completed", h.hasErrors = b.hasErrors || !1, h.alerts = b.alerts || [], h.hasErrors || a(function() { d.deleteTask(h); }, c); }); }, b.prototype.taskList = function() { return this.tasks; }, b.prototype.deleteTask = function(a) { var b = d.tasks.indexOf(a); b >= 0 && this.tasks.splice(b, 1); }, b.prototype.clear = function() { d.tasks = []; }, d; } ]), angular.module("openshiftConsole").factory("Notification", [ "$rootScope", function(a) { function b() { this.messenger = Messenger({ extraClasses:"messenger-fixed messenger-on-bottom messenger-on-right", theme:"flat", messageDefaults:{ showCloseButton:!0, hideAfter:10 } }); var b = this; a.$on("$routeChangeStart", function(a, c, d) { b.clear(); }); } return b.prototype.notify = function(a, b, c) { c = c || {}; var d = { type:a, message:$("
").text(b).html(), id:c.id, actions:c.actions }; c.mustDismiss && (d.hideAfter = !1), this.messenger.post(d); }, b.prototype.success = function(a, b) { this.notify("success", a, b); }, b.prototype.info = function(a, b) { this.notify("info", a, b); }, b.prototype.error = function(a, b) { this.notify("error", a, b); }, b.prototype.warning = function(a, b) { this.notify("warning", a, b); }, b.prototype.clear = function() { this.messenger.hideAll(); }, new b(); } ]), angular.module("openshiftConsole").factory("ImageStreamResolver", [ "$q", "DataService", function(a, b) { function c() {} return c.prototype.fetchReferencedImageStreamImages = function(c, d, e, f) { var g = {}; return angular.forEach(c, function(a) { angular.forEach(a.spec.containers, function(a) { var c = a.image; if (c && !d[c] && !g[c]) { var h = e[c]; if (h) { var i = h.split("@"), j = b.get("imagestreamimages", h, f); j.then(function(a) { if (a && a.image) { var b = angular.copy(a.image); b.imageStreamName = i[0], b.imageStreamNamespace = f.project.metadata.name, d[c] = b; } }), g[c] = j; } } }); }), a.all(g); }, c.prototype.buildDockerRefMapForImageStreams = function(a, b) { angular.forEach(a, function(a) { angular.forEach(a.status.tags, function(c) { angular.forEach(c.items, function(c) { c.image && (b[c.dockerImageReference] = a.metadata.name + "@" + c.image); }); }); }); }, new c(); } ]), angular.module("openshiftConsole").factory("BaseHref", [ "$document", function(a) { return a.find("base").attr("href") || "/"; } ]), angular.module("openshiftConsole").factory("BuildsService", [ "DataService", "$filter", function(a, b) { var c = b("annotation"), d = b("buildConfigForBuild"), e = b("isIncompleteBuild"), f = b("isNewerResource"), g = function(b, c) { var d = { kind:"BuildRequest", apiVersion:"v1", metadata:{ name:b } }; return a.create("buildconfigs/instantiate", b, d, c); }, h = function(b, c, d) { var e = angular.copy(b); return e.status.cancelled = !0, a.update("builds", e.metadata.name, e, d); }, i = function(b, c) { var d = { kind:"BuildRequest", apiVersion:"v1", metadata:{ name:b } }; return a.create("builds/clone", b, d, c); }, j = function(a) { return "true" === c(a, "openshift.io/build-config.paused"); }, k = function(a) { return !!a && (!a.metadata.deletionTimestamp && !j(a)); }, l = function(a) { var b = c(a, "pipeline.alpha.openshift.io/uses"); if (!b) return []; try { b = JSON.parse(b); } catch (d) { return void Logger.warn('Could not parse "pipeline.alpha.openshift.io/uses" annotation', d); } var e = []; return _.each(b, function(b) { b.name && (b.namespace && b.namespace !== _.get(a, "metadata.namespace") || "DeploymentConfig" === b.kind && e.push(b.name)); }), e; }, m = function(a, b) { return _.pick(b, function(b) { var d = c(b, "buildConfig"); return !d || d === a; }); }, n = function(a, b) { var c = {}; return _.each(a, function(a) { var e = d(a) || ""; b && !b(a) || f(a, c[e]) && (c[e] = a); }), c; }, o = function(a) { var b = c(a, "buildNumber") || parseInt(a.metadata.name.match(/(\d+)$/), 10); return isNaN(b) ? null :b; }, p = function(a) { return a.status.startTimestamp || a.metadata.creationTimestamp; }, q = function(a) { return _.round(a / 1e3 / 1e3); }, r = function(a) { var b = _.get(a, "status.duration"); if (b) return q(b); var c = p(a), d = a.status.completionTimestamp; return c && d ? moment(d).diff(moment(c)) :0; }, s = function(a) { return _.map(a, function(a) { return e(a); }); }, t = function(a) { return _.map(a, function(a) { return !e(a); }); }, u = function(a) { return _.reduce(a, function(a, c) { if (e(c)) return a; var d = b("annotation")(c, "buildConfig"); return f(c, a[d]) && (a[d] = c), a; }, {}); }, v = function(a) { var c = {}, d = _.filter(a, function(a) { if (e(a)) return !0; var d = b("annotation")(a, "buildConfig"); f(a, c[d]) && (c[d] = a); }); return d.concat(_.map(c, function(a) { return a; })); }; return { startBuild:g, cancelBuild:h, cloneBuild:i, isPaused:j, canBuild:k, usesDeploymentConfigs:l, validatedBuildsForBuildConfig:m, latestBuildByConfig:n, getBuildNumber:o, getStartTimestsamp:p, getDuration:r, incompleteBuilds:s, completeBuilds:t, lastCompleteByBuildConfig:u, interestingBuilds:v }; } ]), angular.module("openshiftConsole").factory("DeploymentsService", [ "APIService", "DataService", "$filter", "$q", "LabelFilter", function(a, b, c, d, e) { function f() {} var g = c("annotation"); f.prototype.startLatestDeployment = function(a, d, e) { var f = { kind:"DeploymentConfig", apiVersion:"v1", metadata:a.metadata, spec:a.spec, status:a.status }; f.status.latestVersion || (f.status.latestVersion = 0), f.status.latestVersion++, b.update("deploymentconfigs", a.metadata.name, f, d).then(function() { e.alerts = e.alerts || {}, e.alerts.deploy = { type:"success", message:"Deployment #" + f.status.latestVersion + " of " + a.metadata.name + " has started." }; }, function(a) { e.alerts = e.alerts || {}, e.alerts.deploy = { type:"error", message:"An error occurred while starting the deployment.", details:c("getErrorDetails")(a) }; }); }, f.prototype.retryFailedDeployment = function(a, d, e) { var f = angular.copy(a), h = a.metadata.name, i = g(a, "deploymentConfig"); b.list("pods", d, function(a) { var d = a.by("metadata.name"), f = function(a) { var d = c("annotationName")("deployerPodFor"); a.metadata.labels[d] === h && b["delete"]("pods", a.metadata.name, e).then(function() { Logger.info("Deployer pod " + a.metadata.name + " deleted"); }, function(a) { e.alerts = e.alerts || {}, e.alerts.retrydeployer = { type:"error", message:"An error occurred while deleting the deployer pod.", details:c("getErrorDetails")(a) }; }); }; angular.forEach(d, f); }); var j = c("annotationName")("deploymentStatus"), k = c("annotationName")("deploymentStatusReason"), l = c("annotationName")("deploymentCancelled"); f.metadata.annotations[j] = "New", delete f.metadata.annotations[k], delete f.metadata.annotations[l], b.update("replicationcontrollers", h, f, d).then(function() { e.alerts = e.alerts || {}, e.alerts.retry = { type:"success", message:"Retrying deployment " + h + " of " + i + "." }; }, function(a) { e.alerts = e.alerts || {}, e.alerts.retry = { type:"error", message:"An error occurred while retrying the deployment.", details:c("getErrorDetails")(a) }; }); }, f.prototype.rollbackToDeployment = function(a, d, e, f, h, i) { var j = a.metadata.name, k = g(a, "deploymentConfig"), l = { kind:"DeploymentConfigRollback", apiVersion:"v1", spec:{ from:{ name:j }, includeTemplate:!0, includeReplicationMeta:d, includeStrategy:e, includeTriggers:f } }; b.create("deploymentconfigrollbacks", null, l, h).then(function(a) { b.update("deploymentconfigs", k, a, h).then(function(a) { i.alerts = i.alerts || {}, i.alerts.rollback = { type:"success", message:"Deployment #" + a.status.latestVersion + " is rolling back " + k + " to " + j + "." }; }, function(a) { i.alerts = i.alerts || {}, i.alerts.rollback = { type:"error", message:"An error occurred while rolling back the deployment.", details:c("getErrorDetails")(a) }; }); }, function(a) { i.alerts = i.alerts || {}, i.alerts.rollback = { type:"error", message:"An error occurred while rolling back the deployment.", details:c("getErrorDetails")(a) }; }); }, f.prototype.cancelRunningDeployment = function(a, d, e) { var f = a.metadata.name, g = c("annotation")(a, "deploymentConfig"), h = angular.copy(a), i = c("annotationName")("deploymentCancelled"), j = c("annotationName")("deploymentStatusReason"); h.metadata.annotations[i] = "true", h.metadata.annotations[j] = "The deployment was cancelled by the user", b.update("replicationcontrollers", f, h, d).then(function() { e.alerts = e.alerts || {}, e.alerts.cancel = { type:"success", message:"Cancelled deployment " + f + " of " + g + "." }; }, function(a) { e.alerts = e.alerts || {}, e.alerts.cancel = { type:"error", message:"An error occurred while cancelling the deployment.", details:c("getErrorDetails")(a) }; }); }, f.prototype.associateDeploymentsToDeploymentConfig = function(a, b, d) { var f = {}, g = e.getLabelSelector(); return angular.forEach(a, function(a, e) { var h = c("annotation")(a, "deploymentConfig"); (!d || b && b[h] || g.matches(a)) && (h = h || "", f[h] = f[h] || {}, f[h][e] = a); }), angular.forEach(b, function(a, b) { f[b] = f[b] || {}; }), f; }, f.prototype.deploymentBelongsToConfig = function(a, b) { return !(!a || !b) && b === c("annotation")(a, "deploymentConfig"); }, f.prototype.associateRunningDeploymentToDeploymentConfig = function(a) { var b = {}; return angular.forEach(a, function(a, d) { b[d] = {}, angular.forEach(a, function(a, e) { var f = c("deploymentStatus")(a); "New" !== f && "Pending" !== f && "Running" !== f || (b[d][e] = a); }); }), b; }, f.prototype.getActiveDeployment = function(a) { var b = c("deploymentIsInProgress"), d = c("annotation"), e = null; return _.each(a, function(a) { return b(a) ? (e = null, !1) :void ("Complete" === d(a, "deploymentStatus") && (!e || e.metadata.creationTimestamp < a.metadata.creationTimestamp) && (e = a)); }), e; }, f.prototype.getRevision = function(a) { return g(a, "deployment.kubernetes.io/revision"); }, f.prototype.isActiveReplicaSet = function(a, b) { var c = this.getRevision(a), d = this.getRevision(b); return !(!c || !d) && c === d; }, f.prototype.getActiveReplicaSet = function(a, b) { var c = this.getRevision(b); if (!c) return null; var d = this; return _.find(a, function(a) { return d.getRevision(a) === c; }); }, f.prototype.getScaleResource = function(b) { var c = { resource:a.kindToResource(b.kind) + "/scale" }; switch (b.kind) { case "DeploymentConfig": break; case "Deployment": case "ReplicaSet": case "ReplicationController": c.group = "extensions"; break; default: return null; } return c; }, f.prototype.scale = function(a, c) { var e = this.getScaleResource(a); if (!e) return d.reject({ data:{ message:"Cannot scale kind " + a.kind + "." } }); var f = { apiVersion:"extensions/v1beta1", kind:"Scale", metadata:{ name:a.metadata.name, namespace:a.metadata.namespace, creationTimestamp:a.metadata.creationTimestamp }, spec:{ replicas:c } }; return b.update(e, a.metadata.name, f, { namespace:a.metadata.namespace }); }; var h = function(a, b) { var c = _.get(b, [ a ]); return !_.isEmpty(c); }, i = function(a, b) { var c = _.get(b, [ a ]); return !_.isEmpty(c); }; return f.prototype.isScalable = function(a, b, c, d, e) { if (i(a.metadata.name, d)) return !1; var f = g(a, "deploymentConfig"); if (!f) return !0; if (!b) return !1; if (!b[f]) return !0; if (h(f, c)) return !1; var j = _.get(e, [ f, "metadata", "name" ]); return j === a.metadata.name; }, f.prototype.groupByDeploymentConfig = function(a) { var b = {}; return _.each(a, function(a) { var d = c("annotation")(a, "deploymentConfig") || ""; _.set(b, [ d, a.metadata.name ], a); }), b; }, f.prototype.sortByRevision = function(a) { var b = this, c = function(a) { var c = b.getRevision(a); if (!c) return null; var d = parseInt(c, 10); return isNaN(d) ? null :d; }, d = function(a, b) { var d = c(a), e = c(b); return d || e ? d ? e ? e - d :-1 :1 :a.metadata.name.localeCompare(b.metadata.name); }; return _.toArray(a).sort(d); }, f.prototype.setPaused = function(c, d, e) { var f = angular.copy(c), g = a.objectToResourceGroupVersion(c); return _.set(f, "spec.paused", d), b.update(g, c.metadata.name, f, e); }, new f(); } ]), angular.module("openshiftConsole").factory("ImageStreamsService", function() { return { tagsByName:function(a) { var b = {}; return angular.forEach(a.spec.tags, function(c) { b[c.name] = b[c.name] || {}, b[c.name].name = c.name, b[c.name].spec = angular.copy(c); var d = b[c.name].spec.from; if (d) { var e; if ("ImageStreamImage" === d.kind ? e = "@" :"ImageStreamTag" === d.kind && (e = ":"), e) { d._nameConnector = e; var f = d.name.split(e); 1 === f.length ? (d._imageStreamName = a.metadata.name, d._idOrTag = f[0], d._completeName = d._imageStreamName + e + d._idOrTag) :(d._imageStreamName = f.shift(), d._idOrTag = f.join(e), d._completeName = d._imageStreamName + e + d._idOrTag); } } }), angular.forEach(a.status.tags, function(a) { b[a.tag] = b[a.tag] || {}, b[a.tag].name = a.tag, b[a.tag].status = angular.copy(a); }), b; } }; }), angular.module("openshiftConsole").factory("MembershipService", [ "$filter", function(a) { var b = (a("annotation"), function(a, b) { return 1 === _.filter(b, function(b) { return _.some(b.subjects, { name:a }); }).length; }), c = function() { return _.reduce(_.slice(arguments), function(a, b, c) { return b ? _.isEqual(c, 0) ? b :a + "-" + b :a; }, ""); }, d = function() { return { User:{ kind:"User", sortOrder:1, name:"User", subjects:{} }, Group:{ kind:"Group", sortOrder:2, name:"Group", subjects:{} }, ServiceAccount:{ kind:"ServiceAccount", sortOrder:3, description:"Service accounts provide a flexible way to control API access without sharing a regular user’s credentials.", helpLinkKey:"service_accounts", name:"ServiceAccount", subjects:{} }, SystemUser:{ kind:"SystemUser", sortOrder:4, description:"System users are virtual users automatically provisioned by the system.", helpLinkKey:"users_and_groups", name:"SystemUser", subjects:{} }, SystemGroup:{ kind:"SystemGroup", sortOrder:5, description:"System groups are virtual groups automatically provisioned by the system.", helpLinkKey:"users_and_groups", name:"SystemGroup", subjects:{} } }; }, e = function(a, b) { var e = _.reduce(a, function(a, d) { var e = c(d.roleRef.namespace ? "Role" :"ClusterRole", d.roleRef.name); return _.each(d.subjects, function(d) { var f = c(d.namespace, d.name); a[d.kind].subjects[f] || (a[d.kind].subjects[f] = { name:d.name, namespace:d.namespace, roles:{} }), _.includes(a[d.kind].subjects[f].roles, e) || (a[d.kind].subjects[f].roles[e] = b[e]); }), a; }, d()); return _.sortBy(e, "sortOrder"); }, f = function(a) { return _.sortBy(a, "metadata.name"); }, g = function(a) { return _.filter(a, function(a) { return _.isEqual(a.metadata.name, "system:image-puller") || _.isEqual(a.metadata.name, "system:image-pusher") || _.isEqual(a.metadata.name, "system:image-builder") || _.isEqual(a.metadata.name, "system:deployer") || !_.startsWith(a.metadata.name, "cluster-") && !_.startsWith(a.metadata.name, "system:") && !_.startsWith(a.metadata.name, "registry-") && !_.startsWith(a.metadata.name, "self-"); }); }, h = function(a) { return _.reduce(a, function(a, b) { return a[c(b.kind, b.metadata.name)] = b, a; }, {}); }, i = function(a, b) { return _.merge(h(a), h(b)); }; return { sortRoles:f, filterRoles:g, mapRolesForUI:i, isLastRole:b, getSubjectKinds:d, mapRolebindingsForUI:e }; } ]), angular.module("openshiftConsole").factory("RolesService", [ "$q", "DataService", function(a, b) { var c = function(c) { return a.all([ b.list("roles", c, null), b.list("clusterroles", {}, null) ]); }; return { listAllRoles:c }; } ]), angular.module("openshiftConsole").factory("RoleBindingsService", [ "$q", "DataService", function(a, b) { var c = {}, d = function(a, b) { var e = b ? a + b :a; return _.some(c, _.matchesProperty("metadata.name", e)) ? d(a, _.uniqueId()) :e; }, e = function(a, b) { var c = _.get(a, "metadata.name"), e = c ? d(c) :null; return { kind:"RoleBinding", apiVersion:"v1", metadata:{ name:e, namespace:b }, roleRef:{ name:_.get(a, "metadata.name"), namespace:_.get(a, "metadata.namespace") }, subjects:[] }; }, f = function(a, b) { return _.isEqual(a.kind, "ServiceAccount") ? a.namespace = a.namespace || b :(_.isEqual(a.kind, "SystemUser") || _.isEqual(a.kind, "SystemGroup")) && (_.startsWith(a.name, "system:") || (a.name = "system:" + a.name)), a; }, g = function(a) { a.userNames = null, a.groupNames = null; }, h = function(a, c, d, g) { var h = e(a, d); return c = f(c, d), h.subjects.push(angular.copy(c)), b.create("rolebindings", null, h, g); }, i = function(a, c, d, h) { var i = e(), j = _.extend(i, a); if (!c) return j; if (c = f(c, d), _.isArray(j.subjects)) { if (_.includes(j.subjects, c)) return; j.subjects.push(c); } else j.subjects = [ c ]; return g(j), b.update("rolebindings", j.metadata.name, j, h); }, j = function(c, d, f, h) { var i = _.filter(f, { roleRef:{ name:d } }); return a.all(_.map(i, function(a) { var d = e(); return a = _.extend(d, a), g(a), a.subjects = _.reject(a.subjects, { name:c }), a.subjects.length ? b.update("rolebindings", a.metadata.name, a, h) :b["delete"]("rolebindings", a.metadata.name, h); })); }, k = function(a, d, e) { return b.list("rolebindings", a, function(a) { c = a.by("metadata.name"), d(a); }, e); }; return { list:k, create:h, addSubject:i, removeSubject:j }; } ]), angular.module("openshiftConsole").factory("MetricsService", [ "$filter", "$http", "$q", "$rootScope", "APIDiscovery", function(a, b, c, d, e) { function f() { return angular.isDefined(k) ? c.when(k) :e.getMetricsURL().then(function(a) { return k = (a || "").replace(/\/$/, ""); }); } function g(a) { if (a.length) return _.each(a, function(a) { if (!a.value || "NaN" === a.value) { var b = a.avg; a.value = b && "NaN" !== b ? b :null; } }), a; } function h(a) { return a.join("|"); } function i() { return f().then(function(a) { return a ? a + "/metrics/stats/query" :a; }); } function j(a) { return f().then(function(b) { var c = b + n; return URI.expand(c, { podUID:a.pod.metadata.uid, containerName:a.containerName, metric:a.metric }).toString(); }); } var k, l, m, n = "/gauges/{containerName}%2F{podUID}%2F{metric}/data", o = function(a) { return f().then(function(c) { return !!c && (!a || (!!l || !m && b.get(c).then(function() { return l = !0, !0; }, function(a) { return m = !0, d.$broadcast("metrics-connection-failed", { url:c, response:a }), !1; }))); }); }, p = function(a) { var b = a.split("/"); return { podUID:b[1], descriptor:b[2] + "/" + b[3] }; }, q = function(a, c, d) { var e = _.indexBy(d.pods, "metadata.uid"); return b.post(a, c, { auth:{}, headers:{ Accept:"application/json", "Content-Type":"application/json", "Hawkular-Tenant":d.namespace } }).then(function(a) { var b = {}, c = function(a, c) { var d = p(c), f = _.get(e, [ d.podUID, "metadata", "name" ]), h = g(a); _.set(b, [ d.descriptor, f ], h); }; return _.each(a.data.counter, c), _.each(a.data.gauge, c), b; }); }, r = _.template("descriptor_name:network/tx_rate|network/rx_rate,type:pod,pod_id:<%= uid %>"), s = _.template("descriptor_name:memory/usage|cpu/usage_rate,type:pod_container,pod_id:<%= uid %>,container_name:<%= containerName %>"), t = function(a) { return i().then(function(b) { var d = { bucketDuration:a.bucketDuration, start:a.start }; a.end && (d.end = a.end); var e = [], f = h(_.map(a.pods, "metadata.uid")), g = _.assign({ tags:s({ uid:f, containerName:a.containerName }) }, d); e.push(q(b, g, a)); var i = _.assign({ tags:r({ uid:f }) }, d); return e.push(q(b, i, a)), c.all(e).then(function(a) { var b = {}; return _.each(a, function(a) { _.assign(b, a); }), b; }); }); }; return { isAvailable:o, getMetricsURL:f, get:function(a) { return j(a).then(function(c) { if (!c) return null; var d = { bucketDuration:a.bucketDuration, start:a.start }; return a.end && (d.end = a.end), b.get(c, { auth:{}, headers:{ Accept:"application/json", "Hawkular-Tenant":a.namespace }, params:d }).then(function(b) { return _.assign(b, { metricID:a.metric, data:g(b.data) }); }); }); }, getCurrentUsage:function(a) { return j(a).then(function(c) { if (!c) return null; var d = { bucketDuration:"1mn", start:"-1mn" }; return b.get(c, { auth:{}, headers:{ Accept:"application/json", "Hawkular-Tenant":a.namespace }, params:d }).then(function(b) { return _.assign(b, { metricID:a.metric, usage:_.head(g(b.data)) }); }); }); }, getPodMetrics:t }; } ]), angular.module("openshiftConsole").factory("MetricsCharts", [ "$timeout", "ConversionService", function(a, b) { var c = function(a, c) { if (void 0 === a.value || null === a.value) return null; switch (c) { case "memory/usage": return _.round(b.bytesToMiB(a.value), 2); case "cpu/usage_rate": return b.millicoresToCores(a.value); case "network/rx_rate": case "network/tx_rate": return _.round(b.bytesToKiB(a.value), 2); default: return _.round(a.value); } }, d = { "memory/usage":"Memory", "cpu/usage_rate":"CPU", "network/tx_rate":"Sent", "network/rx_rate":"Received" }; return { uniqueID:function() { return _.uniqueId("metrics-"); }, getDefaultUpdateInterval:function() { return 6e4; }, getTimeRangeOptions:function() { return [ { label:"Last hour", value:60 }, { label:"Last 4 hours", value:240 }, { label:"Last day", value:1440 }, { label:"Last 3 days", value:4320 }, { label:"Last week", value:10080 } ]; }, getDefaultSparklineConfig:function(a, b, c) { return { bindto:"#" + a, axis:{ x:{ show:!c, type:"timeseries", padding:{ left:0, bottom:0 }, tick:{ type:"timeseries", format:"%a %H:%M" } }, y:{ show:!c, label:b, min:0, padding:{ left:0, top:20, bottom:0 } } }, point:{ show:!1 }, size:{ height:c ? 35 :175 }, tooltip:{ format:{ value:function(a) { var c = "cores" === b ? 3 :2; return d3.round(a, c) + " " + b; } } } }; }, getSparklineData:function(a) { var b, e = { type:"spline", x:"dates", names:d }, f = {}; return _.each(a, function(a, d) { b = [ "dates" ], f[d] = [ d ], _.each(a, function(a) { var e = c(a, d); b.push(a.start), f[d].push(e); }); }), e.columns = [ b ].concat(_.values(f)), e; }, formatUsage:function(a) { return a < .001 ? "0" :a < 1 ? d3.format(".1r")(a) :d3.format(".2r")(a); }, redraw:function(b) { a(function() { _.each(b, function(a) { a.flush(); }); }, 0); } }; } ]), angular.module("openshiftConsole").factory("StorageService", [ "APIService", "DataService", function(a, b) { return { createVolume:function(a, b) { return { name:a, persistentVolumeClaim:{ claimName:b.metadata.name } }; }, createVolumeMount:function(a, b) { return { name:a, mountPath:b }; }, getVolumeNames:function(a) { var b = _.get(a, "spec.volumes", []); return _.map(b, "name"); }, getMountPaths:function(a, b) { var c = [], d = _.get(a, "spec.containers", []); return _.each(d, function(a) { if (!b || b(a)) { var d = _.get(a, "volumeMounts", []); _.each(d, function(a) { c.push(a.mountPath); }); } }), c; }, removeVolume:function(c, d, e) { var f = angular.copy(c), g = _.get(f, "spec.template.spec.volumes"); _.remove(g, { name:d.name }); var h = _.get(f, "spec.template.spec.containers"); _.each(h, function(a) { _.remove(a.volumeMounts, { name:d.name }); }); var i = a.objectToResourceGroupVersion(f); return b.update(i, f.metadata.name, f, e); } }; } ]), angular.module("openshiftConsole").factory("Constants", function() { var a = _.clone(window.OPENSHIFT_CONSTANTS || {}), b = _.clone(window.OPENSHIFT_VERSION || {}); return a.VERSION = b, a; }), angular.module("openshiftConsole").factory("LimitRangesService", [ "$filter", "LIMIT_REQUEST_OVERRIDES", function(a, b) { var c = a("usageValue"), d = a("usageWithUnits"), e = a("amountAndUnit"), f = function(a, b) { return !!a && (!b || c(a) < c(b)); }, g = function(a, b) { return !!a && (!b || c(a) > c(b)); }, h = function(c) { if (!b) return !1; var d = a("annotation")(c, "quota.openshift.io/cluster-resource-override-enabled"); return !d || "true" === d; }, i = function(a, c) { if (!h(c)) return null; switch (a) { case "cpu": return b.cpuRequestToLimitPercent; case "memory": return b.memoryRequestToLimitPercent; default: return null; } }, j = function(a, b) { return !!i(a, b); }, k = function(a, c) { return h(c) && "cpu" === a && !!b.limitCPUToMemoryPercent; }, l = function(a, b, c, d) { var h = {}; angular.forEach(a, function(a) { angular.forEach(a.spec.limits, function(a) { if (a.type === c) { a.min && g(a.min[b], h.min) && (h.min = a.min[b]), a.max && f(a.max[b], h.max) && (h.max = a.max[b]), a["default"] && (h.defaultLimit = a["default"][b] || h.defaultLimit), a.defaultRequest && (h.defaultRequest = a.defaultRequest[b] || h.defaultRequest); var d; a.maxLimitRequestRatio && (d = a.maxLimitRequestRatio[b], d && (!h.maxLimitRequestRatio || d < h.maxLimitRequestRatio) && (h.maxLimitRequestRatio = d)); } }); }); var j, k, l, m; return h.min && (j = i(b, d), j && (k = e(h.min), l = Math.ceil(k[0] / (j / 100)), m = k[1] || "", h.min = "" + l + m)), h; }, m = function(b, e, f, g) { if (!f || !f.length) return []; var h = l(b, e, "Pod", g), i = l(b, e, "Container", g), m = 0, n = 0, o = h.min && c(h.min), p = h.max && c(h.max), q = [], r = a("computeResourceLabel")(e, !0); return angular.forEach(f, function(a) { var b = a.resources || {}, d = b.requests && b.requests[e] || i.defaultRequest; d && (m += c(d)); var f = b.limits && b.limits[e] || i.defaultLimit; f && (n += c(f)); }), j(e, g) || (o && m < o && q.push(r + " request total for all containers is less than pod minimum (" + d(h.min, e) + ")."), p && m > p && q.push(r + " request total for all containers is greater than pod maximum (" + d(h.max, e) + ").")), k(e, g) || (o && n < o && q.push(r + " limit total for all containers is less than pod minimum (" + d(h.min, e) + ")."), p && n > p && q.push(r + " limit total for all containers is greater than pod maximum (" + d(h.max, e) + ").")), q; }; return { getEffectiveLimitRange:l, getRequestToLimitPercent:i, isRequestCalculated:j, isLimitCalculated:k, validatePodLimits:m }; } ]), angular.module("openshiftConsole").factory("RoutesService", [ "$filter", function(a) { var b = function(a) { return angular.isString(a); }, c = function(a, c) { return _.find(c.spec.ports, function(c) { return b(a) ? c.name === a :c.targetPort === a; }); }, d = function(a, d, e) { if (!d) return void e.push('Routes to service "' + a.spec.to.name + '", but service does not exist.'); var f = a.spec.port ? a.spec.port.targetPort :null; if (!f) return void (d.spec.ports.length > 1 && e.push('Route has no target port, but service "' + d.metadata.name + '" has multiple ports. The route will round robin traffic across all exposed ports on the service.')); var g = c(f, d); g || (b(f) ? e.push('Route target port is set to "' + f + '", but service "' + d.metadata.name + '" has no port with that name.') :e.push('Route target port is set to "' + f + '", but service "' + d.metadata.name + '" does not expose that port.')); }, e = function(a, b) { a.spec.tls && (a.spec.tls.termination || b.push("Route has a TLS configuration, but no TLS termination type is specified. TLS will not be enabled until a termination type is set."), "passthrough" === a.spec.tls.termination && a.spec.path && b.push('Route path "' + a.spec.path + '" will be ignored since the route uses passthrough termination.')); }, f = function(a, b) { var c = _.get(a, "spec.wildcardPolicy"); angular.forEach(a.status.ingress, function(a) { var d = _.find(a.conditions, { type:"Admitted", status:"False" }); if (d) { var e = "Requested host " + (a.host || "") + " was rejected by the router."; (d.message || d.reason) && (e += " Reason: " + (d.message || d.reason) + "."), b.push(e); } d || "Subdomain" !== c || a.wildcardPolicy === c || b.push('Router "' + a.routerName + '" does not support wildcard subdomains. Your route will only be available at host ' + a.host + "."); }); }, g = function(a) { return _.some(a.status.ingress, function(a) { return _.some(a.conditions, { type:"Admitted", status:"True" }); }); }, h = function(b) { return "true" !== a("annotation")(b, "openshift.io/host.generated"); }, i = function(a) { var b = 0; g(a) && (b += 11); var c = _.get(a, "spec.alternateBackends"); return _.isEmpty(c) || (b += 5), h(a) && (b += 3), a.spec.tls && (b += 1), b; }, j = function(a, b) { var c = i(a), d = i(b); return d > c ? b :a; }, k = function(a) { return _.groupBy(a, "spec.to.name"); }, l = function(a) { var b = _.get(a, "spec.host", ""); return b.replace(/^[a-z0-9]([-a-z0-9]*[a-z0-9])\./, ""); }; return { getRouteWarnings:function(a, b) { var c = []; return a ? ("Service" === a.spec.to.kind && d(a, b, c), e(a, c), f(a, c), c) :c; }, getServicePortForRoute:c, getPreferredDisplayRoute:j, groupByService:k, getSubdomain:l }; } ]), angular.module("openshiftConsole").factory("ChartsService", [ "Logger", function(a) { return { updateDonutCenterText:function(b, c, d) { var e = d3.select(b).select("text.c3-chart-arcs-title"); return e ? (e.selectAll("*").remove(), e.insert("tspan").text(c).classed(d ? "donut-title-big-pf" :"donut-title-med-pf", !0).attr("dy", d ? 0 :5).attr("x", 0), void (d && e.insert("tspan").text(d).classed("donut-title-small-pf", !0).attr("dy", 20).attr("x", 0))) :void a.warn("Can't select donut title element"); } }; } ]), angular.module("openshiftConsole").factory("HPAService", [ "$filter", "$q", "LimitRangesService", "MetricsService", "Logger", function(a, b, c, d, e) { var f = function(a) { return c.getRequestToLimitPercent("cpu", a); }, g = function(a, b) { var c = f(b); if (!c) return e.warn("convertRequestPercentToLimit called, but no request/limit ratio defined."), NaN; if (!a) return a; var d = c / 100 * a; return Math.round(d); }, h = function(a, b) { var c = f(b); if (!c) return e.warn("convertLimitPercentToRequest called, but no request/limit ratio defined."), NaN; if (!a) return a; var d = a / (c / 100); return Math.round(d); }, i = function(a, b, c) { return _.every(c, function(c) { return _.get(c, [ "resources", b, a ]); }); }, j = function(a, b) { return i(a, "requests", b); }, k = function(a, b) { return i(a, "limits", b); }, l = function(a, b, d, e) { var f = c.getEffectiveLimitRange(d, a, "Container", e); return !!f[b]; }, m = function(a, b, c) { return l(a, "defaultRequest", b, c); }, n = function(a, b, c) { return l(a, "defaultLimit", b, c); }, o = function(a, b, d) { return !(!j("cpu", a) && !m("cpu", b, d)) || (!(!k("cpu", a) && !n("cpu", b, a)) || !!c.isLimitCalculated("cpu", d) && (k("memory", a) || n("memory", b, d))); }, p = function(a, b, c) { return _.filter(a, function(a) { return a.spec.scaleRef.kind === b && a.spec.scaleRef.name === c; }); }, q = a("humanizeKind"), r = a("hasDeploymentConfig"), s = function(a, e, f, g) { return !a || _.isEmpty(e) ? b.when([]) :d.isAvailable().then(function(b) { var d = []; b || d.push({ message:"Metrics might not be configured by your cluster administrator. Metrics are required for autoscaling.", reason:"MetricsNotAvailable" }); var h, i, j = _.get(a, "spec.template.spec.containers", []); o(j, f, g) || (h = q(a.kind), c.isRequestCalculated("cpu", g) ? (i = "This " + h + " does not have any containers with a CPU limit set. Autoscaling will not work without a CPU limit.", c.isLimitCalculated("cpu", g) && (i += " The CPU limit will be automatically calculated from the container memory limit.")) :i = "This " + h + " does not have any containers with a CPU request set. Autoscaling will not work without a CPU request.", d.push({ message:i, reason:"NoCPURequest" })), _.size(e) > 1 && d.push({ message:"More than one autoscaler is scaling this resource. This is not recommended because they might compete with each other. Consider removing all but one autoscaler.", reason:"MultipleHPA" }); var k = function() { return _.some(e, function(a) { return "ReplicationController" === _.get(a, "spec.scaleRef.kind"); }); }; return "ReplicationController" === a.kind && r(a) && _.some(e, k) && d.push({ message:"This deployment is scaled by both a deployment configuration and an autoscaler. This is not recommended because they might compete with each other.", reason:"DeploymentHasHPA" }), d; }); }; return { convertRequestPercentToLimit:g, convertLimitPercentToRequest:h, hasCPURequest:o, filterHPA:p, getHPAWarnings:s }; } ]), angular.module("openshiftConsole").factory("PodsService", function() { return { getImageIDs:function(a, b) { var c = {}; return _.each(a, function(a) { var d, e = _.get(a, "status.containerStatuses", []), f = _.find(e, { name:b }); f && f.imageID && (d = f.imageID.replace(/^docker:\/\/sha256:/, ""), c[d] = !0); }), _.keys(c); }, generateDebugPod:function(a, b) { var c = angular.copy(a), d = _.find(c.spec.containers, { name:b }); return d ? (c.metadata = { name:a.metadata.name + "-debug", annotations:{ "debug.openshift.io/source-container":b, "debug.openshift.io/source-resource":"pods/" + a.metadata.name }, labels:{} }, c.spec.restartPolicy = "Never", delete c.spec.host, delete c.spec.nodeName, c.status = {}, delete d.readinessProbe, delete d.livenessProbe, d.command = [ "sleep" ], d.args = [ "3600" ], c.spec.containers = [ d ], c) :null; } }; }), angular.module("openshiftConsole").service("CachedTemplateService", function() { var a = null; return { setTemplate:function(b) { a = b; }, getTemplate:function() { return a; }, clearTemplate:function() { a = null; } }; }).service("ProcessedTemplateService", function() { var a = function() { return { params:{ all:[], generated:[] }, message:null }; }, b = a(); return { setTemplateData:function(a, c, d) { _.each(a, function(a) { b.params.all.push({ name:a.name, value:a.value }); }), _.each(c, function(a) { a.value || b.params.generated.push(a.name); }), d && (b.message = d); }, getTemplateData:function() { return b; }, clearTemplateData:function() { b = a(); } }; }), angular.module("openshiftConsole").factory("SecretsService", function() { var a = function(a) { var b = { source:[], image:[], other:[] }; return _.each(a.by("metadata.name"), function(a) { switch (a.type) { case "kubernetes.io/basic-auth": case "kubernetes.io/ssh-auth": case "Opaque": b.source.push(a); break; case "kubernetes.io/dockercfg": case "kubernetes.io/dockerconfigjson": b.image.push(a); break; default: b.other.push(a); } }), b; }, b = function(a) { var b = {}, c = JSON.parse(window.atob(a)); return _.each(c, function(a, c) { b[c] = { username:a.username, password:a.password, email:a.email }; }), b; }, c = function(a) { var b = {}, c = JSON.parse(window.atob(a)); return _.each(c.auths, function(a, c) { var d = window.atob(a.auth).split(":"); b[c] = { username:d[0], password:d[1], email:a.email }; }), b; }, d = function(a) { var d = {}, e = _.mapValues(a, function(a, e) { var f, g; switch (e) { case ".dockercfg": return b(a); case ".dockerconfigjson": return c(a); default: return f = window.atob(a), g = /[\x00-\x09\x0E-\x1F]/.test(f), g ? (d[e] = !0, a) :f; } }); return e.$$nonprintable = d, e; }; return { groupSecretsByType:a, decodeSecretData:d }; }), angular.module("openshiftConsole").factory("ServicesService", [ "$filter", "$q", "DataService", function(a, b, c) { var d = "service.alpha.openshift.io/dependencies", e = "service.openshift.io/infrastructure", f = a("annotation"), g = function(a) { var b = f(a, d); if (!b) return null; try { return JSON.parse(b); } catch (c) { return Logger.warn('Could not parse "service.alpha.openshift.io/dependencies" annotation', c), null; } }, h = function(a) { var b, c = g(a); if (!c) return []; b = _.get(a, "metadata.namespace"); var d = function(a) { return !!a.name && ((!a.kind || "Service" === a.kind) && (!a.namespace || a.namespace === b)); }; return _.chain(c).filter(d).map(function(a) { return a.name; }).value(); }, i = function(a, b) { return b.length ? void _.set(a, [ "metadata", "annotations", d ], JSON.stringify(b)) :void (_.has(a, [ "metadata", "annotations", d ]) && delete a.metadata.annotations[d]); }, j = function(a, b) { var d = angular.copy(a), e = g(d) || []; return e.push({ name:b.metadata.name, namespace:a.metadata.namespace === b.metadata.namespace ? "" :b.metadata.namespace, kind:b.kind }), i(d, e), c.update("services", d.metadata.name, d, { namespace:d.metadata.namespace }); }, k = function(a, d) { var e = angular.copy(a), f = g(e) || [], h = _.reject(f, function(b) { if (b.kind !== d.kind) return !1; var c = b.namespace || a.metadata.namespace; return c === d.metadata.namespace && b.name === d.metadata.name; }); return h.length === f.length ? b.when(!0) :(i(e, h), c.update("services", e.metadata.name, e, { namespace:e.metadata.namespace })); }, l = function(a) { return "true" === f(a, e); }; return { getDependentServices:h, linkService:j, removeServiceLink:k, isInfrastructure:l }; } ]), angular.module("openshiftConsole").factory("ImagesService", [ "$filter", "ApplicationGenerator", "DataService", function(a, b, c) { var d = function(a, b) { var d = { kind:"ImageStreamImport", apiVersion:"v1", metadata:{ name:"newapp", namespace:b.namespace }, spec:{ "import":!1, images:[ { from:{ kind:"DockerImage", name:a } } ] }, status:{} }; return c.create("imagestreamimports", null, d, b).then(function(a) { return { name:_.get(a, "spec.images[0].from.name"), image:_.get(a, "status.images[0].image"), tag:_.get(a, "status.images[0].tag"), result:_.get(a, "status.images[0].status") }; }); }, e = function(a) { var b = _.get(a, "dockerImageMetadata.Config.User"); return !b || "0" === b || "root" === b; }, f = function(a) { return _.get(a, "dockerImageMetadata.Config.Volumes"); }, g = function(a) { var c = [], d = { "openshift.io/generated-by":"OpenShiftWebConsole" }, e = []; _.forEach(a.env, function(a, b) { e.push({ name:b, value:a }); }); var f = [], g = [], h = 0; if (_.forEach(a.volumes, function(b, c) { h++; var d = a.name + "-" + h; f.push({ name:d, emptyDir:{} }), g.push({ name:d, mountPath:c }); }), !a.namespace) { var i = { kind:"ImageStream", apiVersion:"v1", metadata:{ name:a.name, labels:a.labels }, spec:{ tags:[ { name:a.tag, annotations:_.assign({ "openshift.io/imported-from":a.image }, d), from:{ kind:"DockerImage", name:a.image }, importPolicy:{} } ] } }; c.push(i); } var j = { kind:"DeploymentConfig", apiVersion:"v1", metadata:{ name:a.name, labels:a.labels, annotations:d }, spec:{ strategy:{ resources:{} }, triggers:[ { type:"ConfigChange" }, { type:"ImageChange", imageChangeParams:{ automatic:!0, containerNames:[ a.name ], from:{ kind:"ImageStreamTag", name:(a.namespace ? a.image :a.name) + ":" + a.tag, namespace:a.namespace } } } ], replicas:1, test:!1, selector:{ app:a.name, deploymentconfig:a.name }, template:{ metadata:{ labels:_.assign({ deploymentconfig:a.name }, a.labels), annotations:d }, spec:{ volumes:f, containers:[ { name:a.name, image:a.image, ports:a.ports, env:e, volumeMounts:g } ], resources:{} } } }, status:{} }; _.first(a.pullSecrets).name && (j.spec.template.spec.imagePullSecrets = a.pullSecrets), c.push(j); var k; return a.ports.length && (k = { kind:"Service", apiVersion:"v1", metadata:{ name:a.name, labels:a.labels, annotations:d }, spec:{ selector:{ deploymentconfig:a.name }, ports:_.map(a.ports, function(a) { return b.getServicePort(a); }) } }, c.push(k)), c; }, h = function(a) { return _.map(_.get(a, "image.dockerImageMetadata.Config.Env"), function(a) { var b = a.indexOf("="), c = "", d = ""; return b > 0 ? (c = a.substring(0, b), b + 1 < a.length && (d = a.substring(b + 1))) :c = a, { name:c, value:d }; }); }; return { findImage:d, getVolumes:f, runsAsRoot:e, getResources:g, getEnvironment:h }; } ]), angular.module("openshiftConsole").service("KeywordService", function() { var a = function(a) { if (!a) return []; var b = _.uniq(_.words(a, /[\w.]+/g)); return b.sort(function(a, b) { return b.length - a.length; }), _.map(b, function(a) { return new RegExp(_.escapeRegExp(a), "i"); }); }, b = function(a, b, c) { var d = a; return c.length ? (angular.forEach(c, function(a) { var c = function(c) { var d; for (d = 0; d < b.length; d++) { var e = _.get(c, b[d]); if (e && a.test(e)) return !0; } return !1; }; d = _.filter(d, c); }), d) :d; }; return { filterForKeywords:b, generateKeywords:a }; }), angular.module("openshiftConsole").factory("ConversionService", function() { var a = function(a) { return a ? a / 1048576 :a; }, b = function(a) { return a ? a / 1024 :a; }, c = function(a) { return a ? a / 1e3 :a; }; return { bytesToMiB:a, bytesToKiB:b, millicoresToCores:c }; }), angular.module("openshiftConsole").service("BreadcrumbsService", [ "$filter", "APIService", "Navigate", function(a, b, c) { var d = a("annotation"), e = a("displayName"), f = function(a) { switch (a) { case "DeploymentConfig": return "Deployments"; default: return _.startCase(b.kindToResource(a, !0)); } }, g = function(a, d, g, h) { var i, j = [], k = h.humanizedKind || f(d); return h.includeProject && (i = h.project ? e(h.project) :g, j.push({ title:i, link:c.projectOverviewURL(g) })), j.push({ title:k, link:c.resourceListURL(b.kindToResource(d), g) }), h.parent && j.push(h.parent), h.subpage ? (j.push({ title:h.displayName || a, link:c.resourceURL(a, d, g) }), j.push({ title:h.subpage })) :j.push({ title:h.displayName || a }), j; }, h = function(b, e) { e = e || {}; var f, h = d(b, "deploymentConfig"); return h && (e.humanizedKind = "Deployments", e.parent = { title:h, link:c.configURLForResource(b) }, f = a("annotation")(b, "deploymentVersion"), f && (e.displayName = "#" + f)), g(b.metadata.name, b.kind, b.metadata.namespace, e); }, i = function(a, b) { switch (a.kind) { case "ReplicationController": return h(a, b); default: return g(a.metadata.name, a.kind, a.metadata.namespace, b); } }, j = function(a) { return a = a || {}, a.object ? i(a.object, a) :a.kind && a.name && a.namespace ? g(a.name, a.kind, a.namespace, a) :[]; }; return { getBreadcrumbs:j }; } ]), angular.module("openshiftConsole").factory("QuotaService", [ "APIService", "$filter", "$q", "DataService", "Logger", function(a, b, c, d, e) { var f = b("isNil"), g = b("usageValue"), h = function(a) { return _.every(a.spec.containers, function(a) { var b = _.some(_.get(a, "resources.requests"), function(a) { return !f(a) && 0 !== g(a); }), c = _.some(_.get(a, "resources.limits"), function(a) { return !f(a) && 0 !== g(a); }); return !b && !c; }); }, i = function(a) { return _.has(a, "spec.activeDeadlineSeconds"); }, j = function(a, b) { var c = h(a), d = i(a); return _.filter(b, function(a) { var b = function(a) { switch (a) { case "Terminating": return d; case "NotTerminating": return !d; case "BestEffort": return c; case "NotBestEffort": return !c; } return !0; }, e = a.spec.quota ? a.spec.quota.scopes :a.spec.scopes; return _.every(e, b); }); }, k = function(a, b) { return a ? "Pod" === a.kind ? j(a, b) :_.has(a, "spec.template") ? j(a.spec.template, b) :b :b; }, l = b("humanizeQuotaResource"), m = b("humanizeKind"), n = function(a, b, c) { var d = a.status.total || a.status; if (g(d.hard[c]) <= g(d.used[c])) { var e, f; return e = "Pod" === b.kind ? "You will not be able to create the " + m(b.kind) + " '" + b.metadata.name + "'." :"You can still create " + m(b.kind) + " '" + b.metadata.name + "' but no pods will be created until resources are freed.", f = "pods" === c ? "You are at your quota for pods." :"You are at your quota for " + l(c) + " on pods.", { type:"Pod" === b.kind ? "error" :"warning", message:f, details:e, links:[ { href:"project/" + a.metadata.namespace + "/quota", label:"View Quota", target:"_blank" } ] }; } return null; }, o = { cpu:"resources.requests.cpu", "requests.cpu":"resources.requests.cpu", "limits.cpu":"resources.limits.cpu", memory:"resources.requests.memory", "requests.memory":"resources.requests.memory", "limits.memory":"resources.limits.memory" }, p = function(a, b, c, d) { var e = a.status.total || a.status, f = o[d], h = 0; if (_.each(c.spec.containers, function(a) { var b = _.get(a, f); b && (h += g(b)); }), g(e.hard[d]) < g(e.used[d]) + h) { var i; return i = "Pod" === b.kind ? "You may not be able to create the " + m(b.kind) + " '" + b.metadata.name + "'." :"You can still create " + m(b.kind) + " '" + b.metadata.name + "' but you may not have pods created until resources are freed.", { type:"warning", message:"You are close to your quota for " + l(d) + " on pods.", details:i, links:[ { href:"project/" + a.metadata.namespace + "/quota", label:"View Quota", target:"_blank" } ] }; } }, q = function(a, b) { var c = [], d = "Pod" === a.kind ? a :_.get(a, "spec.template"); return d ? (_.each([ "cpu", "memory", "requests.cpu", "requests.memory", "limits.cpu", "limits.memory", "pods" ], function(e) { var g = b.status.total || b.status; if (("Pod" !== a.kind || "pods" !== e) && !f(g.hard[e])) { var h = n(b, a, e); if (h) c.push(h); else if ("pods" !== e) { var i = p(b, a, d, e); i && c.push(i); } } }), c) :c; }, r = function(b, c, d) { var e = []; return b && c ? (_.each(b, function(b) { var h = k(b, c), i = k(b, d), j = a.objectToResourceGroupVersion(b), l = a.kindToResource(b.kind, !0), n = m(b.kind), o = ""; j.group && (o = j.group + "/"), o += j.resource; var p = function(a) { var c = a.status.total || a.status; !f(c.hard[o]) && g(c.hard[o]) <= g(c.used[o]) && e.push({ type:"error", message:"You are at your quota of " + c.hard[o] + " " + ("1" === c.hard[o] ? n :l) + " in this project.", details:"You will not be able to create the " + n + " '" + b.metadata.name + "'.", links:[ { href:"project/" + a.metadata.namespace + "/quota", label:"View Quota", target:"_blank" } ] }), e = e.concat(q(b, a)); }; _.each(h, p), _.each(i, p); }), e) :e; }, s = function(a, b) { function f() { 0 === k && (j = r(a, g, h), i.resolve({ quotaAlerts:j })); } var g, h, i = c.defer(), j = [], k = 2; return d.list("resourcequotas", b, function(a) { g = a.by("metadata.name"), e.log("quotas", g), k--, f(); }), d.list("appliedclusterresourcequotas", b, function(a) { h = a.by("metadata.name"), e.log("cluster quotas", h), k--, f(); }), i.promise; }, t = function(a, b) { var c = function(a) { var b = a.status.total || a.status; return _.some(b.hard, function(a, c) { return "resourcequotas" !== c && (!f(a) && g(a) <= g(b.used[c])); }); }; return _.some(a, c) || _.some(b, c); }; return { filterQuotasForResource:k, isBestEffortPod:h, isTerminatingPod:i, getResourceLimitAlerts:q, getQuotaAlerts:r, getLatestQuotaAlerts:s, isAnyQuotaExceeded:t }; } ]), angular.module("openshiftConsole").factory("LabelsService", function() { var a = function(a) { return _.get(a, "spec.template", { metadata:{ labels:{} } }); }; return { groupBySelector:function(b, c, d) { var e = {}, f = {}; return d = d || {}, _.each(c, function(a) { f[a.metadata.uid] = new LabelSelector(a.spec.selector); }), _.each(b, function(b) { if (!d.include || d.include(b)) { var g = _.filter(c, function(c) { var e = f[c.metadata.uid]; return d.matchTemplate ? e.matches(a(b)) :d.matchSelector ? e.covers(new LabelSelector(b.spec.selector)) :e.matches(b); }); g.length || _.set(e, [ "", b.metadata.name ], b), _.each(g, function(a) { var c = _.get(a, d.key || "metadata.name", ""); _.set(e, [ c, b.metadata.name ], b); }); } }), e; } }; }), angular.module("openshiftConsole").factory("CatalogService", [ "$filter", "Constants", "KeywordService", function(a, b, c) { var d = a("tags"), e = {}; _.each(b.CATALOG_CATEGORIES, function(a) { _.each(a.items, function(a) { e[a.id] = a; var b = _.get(a, "subcategories", []); _.each(b, function(a) { _.each(a.items, function(a) { e[a.id] = a; }); }); }); }); var f = function(a) { return e[a]; }, g = function(a, b) { a = a.toLowerCase(); var c; for (c = 0; c < b.length; c++) { var d = b[c].toLowerCase(); if (a === d) return !0; } return !1; }, h = function(a, b) { var c = _.get(a, "categoryAliases", []), d = [ a.id ].concat(c); return _.some(d, function(a) { return g(a, b); }); }, i = function(a) { var b = {}; return _.each(a, function(a) { if (a.status) { var c = {}; a.spec && a.spec.tags && _.each(a.spec.tags, function(a) { var b = _.get(a, "annotations.tags"); b && (c[a.name] = b.split(/\s*,\s*/)); }); var d = !1; _.each(e, function(e) { var f = function(a) { return _.some(a.status.tags, function(a) { var b = c[a.tag] || []; return h(e, b) && g("builder", b) && !g("hidden", b); }); }; f(a) && (b[e.id] = b[e.id] || [], b[e.id].push(a), d = !0); }); var f; d || (f = _.some(a.status.tags, function(a) { var b = c[a.tag] || []; return g("builder", b) && !g("hidden", b); }), f && (b[""] = b[""] || [], b[""].push(a))); } }), b; }, j = function(a) { var b = {}; return _.each(a, function(a) { var c = d(a), f = !1; _.each(e, function(d) { h(d, c) && (b[d.id] = b[d.id] || [], b[d.id].push(a), f = !0); }), f || (b[""] = b[""] || [], b[""].push(a)); }), b; }, k = a("displayName"), l = function(a, b) { if (!b.length) return a; var c = []; return _.each(a, function(a) { var d = _.get(a, "metadata.name", ""), e = k(a, !0), f = _.indexBy(a.spec.tags, "name"); _.each(b, function(b) { b.test(d) || e && b.test(e) || _.each(a.spec.tags, function(a) { var c = _.get(a, "annotations.tags", ""); if (!/\bbuilder\b/.test(c) || /\bhidden\b/.test(c)) return void delete f[a.name]; if (!b.test(a.name)) { var d = _.get(a, "annotations.description"); d && b.test(d) || delete f[a.name]; } }); }); var g; _.isEmpty(f) || (g = angular.copy(a), g.status.tags = _.filter(g.status.tags, function(a) { return f[a.tag]; }), c.push(g)); }), c; }, m = [ "metadata.name", 'metadata.annotations["openshift.io/display-name"]', "metadata.annotations.description" ], n = function(a, b) { return c.filterForKeywords(a, m, b); }; return { getCategoryItem:f, categorizeImageStreams:i, categorizeTemplates:j, filterImageStreams:l, filterTemplates:n }; } ]), angular.module("openshiftConsole").factory("ModalsService", [ "$uibModal", function(a) { return { confirm:function(b) { var c = a.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:b } }); return c.result; }, confirmSaveLog:function(b) { var c = a.open({ animation:!0, templateUrl:"views/modals/confirm-save-log.html", controller:"ConfirmSaveLogController", resolve:{ object:b } }); return c.result; }, showJenkinsfileExamples:function() { a.open({ animation:!0, templateUrl:"views/modals/jenkinsfile-examples-modal.html", controller:"JenkinsfileExamplesModalController" }); }, showComputeUnitsHelp:function() { a.open({ animation:!0, templateUrl:"views/modals/about-compute-units-modal.html", controller:"AboutComputeUnitsModalController" }); } }; } ]), angular.module("openshiftConsole").factory("CLIHelp", [ "$filter", function(a) { var b = a("annotation"), c = function(a, c) { if (!a) return null; var d, e, f; switch (a.kind) { case "Pod": d = "oc logs " + a.metadata.name, c && (d += " -c " + c); break; case "DeploymentConfig": d = "oc logs dc/" + a.metadata.name; break; case "ReplicationController": e = b(a, "deploymentConfig"), f = b(a, "deploymentVersion"), d = e && f ? "oc logs --version " + f + " dc/" + e :"oc logs rc/" + a.metadata.name; break; case "BuildConfig": d = "oc logs bc/" + a.metadata.name; break; case "Build": e = b(a, "buildConfig"), f = b(a, "buildNumber"), d = "oc logs --version " + f + " bc/" + e; break; default: return null; } return d += " -n " + a.metadata.namespace; }; return { getLogsCommand:c }; } ]), angular.module("openshiftConsole").factory("HTMLService", function() { return { linkify:function(a, b, c) { return a ? (c || (a = _.escape(a)), a.replace(/https?:\/\/[A-Za-z0-9._%+-]+\S*[^\s.;,(){}<>"\u201d\u2019]/gm, function(a) { return b ? '' + a + "" :'' + a + ""; })) :a; } }; }), angular.module("openshiftConsole").controller("ProjectsController", [ "$scope", "$filter", "$location", "$route", "$timeout", "AlertMessageService", "AuthService", "DataService", "KeywordService", "Logger", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k) { var l, m, n = [], o = []; a.alerts = a.alerts || {}, a.loading = !0, a.showGetStarted = !1, a.canCreate = void 0, a.search = { text:"" }; var p, q = [ "metadata.name", 'metadata.annotations["openshift.io/display-name"]', 'metadata.annotations["openshift.io/description"]', 'metadata.annotations["openshift.io/requester"]' ], r = function() { a.projects = i.filterForKeywords(m, q, o); }, s = b("displayName"), t = function() { var b = _.get(a, "sortConfig.currentField.id"); p !== b && (a.sortConfig.isAscending = "metadata.creationTimestamp" !== b); var c = function(a) { return s(a).toLowerCase(); }, d = a.sortConfig.isAscending ? "asc" :"desc"; switch (b) { case 'metadata.annotations["openshift.io/display-name"]': m = _.sortByOrder(l, [ c ], [ d ]); break; case 'metadata.annotations["openshift.io/requester"]': m = _.sortByOrder(l, [ b, c ], [ d, "asc" ]); break; default: m = _.sortByOrder(l, [ b ], [ d ]); } p = b; }, u = function() { t(), r(); }; a.sortConfig = { fields:[ { id:'metadata.annotations["openshift.io/display-name"]', title:"Display Name", sortType:"alpha" }, { id:"metadata.name", title:"Name", sortType:"alpha" }, { id:'metadata.annotations["openshift.io/requester"]', title:"Creator", sortType:"alpha" }, { id:"metadata.creationTimestamp", title:"Creation Date", sortType:"alpha" } ], isAscending:!0, onSortChange:u }, f.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), f.clearAlerts(), a.$watch("search.text", _.debounce(function(b) { a.keywords = o = i.generateKeywords(b), a.$apply(r); }, 50, { maxWait:250 })), g.withUser().then(function() { n.push(h.watch("projects", a, function(b) { l = _.toArray(b.by("metadata.name")), a.loading = !1, a.showGetStarted = _.isEmpty(l), u(); })); }), k.canCreate().then(function() { a.canCreate = !0; }, function(b) { a.canCreate = !1; var c = b.data || {}; if (403 !== b.status) { var d = "Failed to determine create project permission"; return 0 !== b.status && (d += " (" + b.status + ")"), void j.warn(d); } if (c.details) { var e = []; _.forEach(c.details.causes || [], function(a) { a.message && e.push(a.message); }), e.length > 0 && (a.newProjectMessage = e.join("\n")); } }), a.$on("$destroy", function() { h.unwatchAll(n); }); } ]), angular.module("openshiftConsole").controller("PodsController", [ "$routeParams", "$scope", "DataService", "ProjectsService", "AlertMessageService", "$filter", "LabelFilter", "Logger", function(a, b, c, d, e, f, g, h) { b.projectName = a.project, b.pods = {}, b.unfilteredPods = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", e.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), e.clearAlerts(); var i = []; d.get(a.project).then(_.spread(function(a, d) { function e() { g.getLabelSelector().isEmpty() || !$.isEmptyObject(b.pods) || $.isEmptyObject(b.unfilteredPods) ? delete b.alerts.pods :b.alerts.pods = { type:"warning", details:"The active filters are hiding all pods." }; } b.project = a, i.push(c.watch("pods", d, function(a) { b.unfilteredPods = a.by("metadata.name"), b.pods = g.getLabelSelector().select(b.unfilteredPods), b.emptyMessage = "No pods to show", g.addLabelSuggestionsFromResources(b.unfilteredPods, b.labelSuggestions), g.setLabelSuggestions(b.labelSuggestions), e(), h.log("pods (subscribe)", b.unfilteredPods); })), g.onActiveFiltersChanged(function(a) { b.$apply(function() { b.pods = a.select(b.unfilteredPods), e(); }); }), b.$on("$destroy", function() { c.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("PodController", [ "$scope", "$filter", "$routeParams", "$timeout", "$uibModal", "Logger", "DataService", "ImageStreamResolver", "MetricsService", "PodsService", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k) { a.projectName = c.project, a.pod = null, a.imageStreams = {}, a.imagesByDockerReference = {}, a.imageStreamImageRefByDockerReference = {}, a.builds = {}, a.alerts = {}, a.terminalDisconnectAlert = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.logOptions = {}, a.terminalTabWasSelected = !1, a.breadcrumbs = [ { title:"Pods", link:"project/" + c.project + "/browse/pods" }, { title:c.pod } ], a.terminalDisconnectAlert.disconnect = { type:"warning", message:"This terminal has been disconnected. If you reconnect, your terminal history will be lost." }, a.noContainersYet = !0, a.selectedTab = {}; var l = [], m = null; i.isAvailable().then(function(b) { a.metricsAvailable = b; }); var n = function(b) { a.logOptions.container = c.container || b.spec.containers[0].name, a.logCanRun = !_.includes([ "New", "Pending", "Unknown" ], b.status.phase); }, o = function() { if (a.pod) { var b = _.find(a.pod.status.containerStatuses, { name:a.logOptions.container }), c = _.get(b, "state"), d = _.head(_.keys(c)), e = _.includes([ "running", "waiting", "terminated" ], d) ? d :"", f = _.get(b, "lastState"), g = _.head(_.keys(f)), h = _.get(b, "state.waiting"); angular.extend(a, { containerStatusKey:e, containerStateReason:_.get(c, [ d, "reason" ]) }), h ? angular.extend(a, { lasStatusKey:g, containerStartTime:_.get(f, [ g, "startedAt" ]), containerEndTime:_.get(f, [ g, "finishedAt" ]) }) :angular.extend(a, { containerStartTime:_.get(c, [ d, "startedAt" ]), containerEndTime:_.get(c, [ d, "finishedAt" ]) }); } }, p = function() { var a = $("").css({ position:"absolute", top:"-100px" }).addClass("terminal-font").text(_.repeat("x", 10)).appendTo("body"), b = { width:a.width() / 10, height:a.height() }; return a.remove(), b; }, q = p(), r = $(window), s = function() { q.height && q.width && a.$apply(function() { var b = $(".container-terminal-wrapper").get(0); if (b) { var c = b.getBoundingClientRect(), d = r.width(), e = r.height(), f = d - c.left - 40, g = e - c.top - 50; a.terminalCols = Math.max(_.floor(f / q.width), 80), a.terminalRows = Math.max(_.floor(g / q.height), 24); } }); }; a.$watch("selectedTab.terminal", function(a) { a ? (q.height && q.width ? $(window).on("resize.terminalsize", _.debounce(s, 100)) :f.warn("Unable to calculate the bounding box for a character. Terminal will not be able to resize."), d(s, 0)) :$(window).off("resize.terminalsize"); }), a.onTerminalSelectChange = function(b) { _.each(a.containerTerminals, function(a) { a.isVisible = !1; }), b.isVisible = !0, b.isUsed = !0, a.selectedTerminalContainer = b; }; var t = function(a) { var b = _.get(a, "state", {}); return _.head(_.keys(b)); }, u = function() { var b = []; _.each(a.pod.spec.containers, function(c) { var d = _.find(a.pod.status.containerStatuses, { name:c.name }), e = t(d); b.push({ containerName:c.name, isVisible:!1, isUsed:!1, containerState:e }); }); var c = _.head(b); return c.isVisible = !0, c.isUsed = !0, a.selectedTerminalContainer = c, b; }, v = function(b) { a.noContainersYet && (a.noContainersYet = 0 === a.containersRunning(b.status.containerStatuses)); }, w = function(b) { _.each(b, function(b) { var c = _.find(a.pod.status.containerStatuses, { name:b.containerName }), d = t(c); b.containerState = d; }); }, x = b("altTextForValueFrom"), y = function() { var b = angular.copy(_.get(a, "pod.spec.containers", [])); _.each(b, function(a) { a.env = a.env || [], _.each(a.env, x); }), a.containersEnv = b; }, z = b("annotation"), A = function(b, c) { a.loaded = !0, a.pod = b, a.dcName = z(b, "deploymentConfig"), a.rcName = z(b, "deployment"), a.deploymentVersion = z(b, "deploymentVersion"), n(b), o(), y(), "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This pod has been deleted." }); }; k.get(c.project).then(_.spread(function(d, i) { m = i, a.project = d, a.projectContext = i, g.get("pods", c.pod, i).then(function(b) { A(b); var d = {}; d[b.metadata.name] = b, a.containerTerminals = u(), v(b), h.fetchReferencedImageStreamImages(d, a.imagesByDockerReference, a.imageStreamImageRefByDockerReference, m), l.push(g.watchObject("pods", c.pod, i, function(b, c) { A(b, c), w(a.containerTerminals), v(b); })); }, function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:"The pod details could not be loaded.", details:"Reason: " + b("getErrorDetails")(c) }; }), a.$watch("logOptions.container", o), l.push(g.watch("imagestreams", i, function(b) { a.imageStreams = b.by("metadata.name"), h.buildDockerRefMapForImageStreams(a.imageStreams, a.imageStreamImageRefByDockerReference), h.fetchReferencedImageStreamImages(a.pods, a.imagesByDockerReference, a.imageStreamImageRefByDockerReference, i), f.log("imagestreams (subscribe)", a.imageStreams); })), l.push(g.watch("builds", i, function(b) { a.builds = b.by("metadata.name"), f.log("builds (subscribe)", a.builds); })); var k, n = function() { var c = a.debugPod; k && (g.unwatch(k), k = null), $(window).off("beforeunload.debugPod"), c && (g["delete"]("pods", c.metadata.name, i, { gracePeriodSeconds:0 }).then(_.noop, function(d) { a.alerts["debug-container-error"] = { type:"error", message:"Could not delete pod " + c.metadata.name, details:"Reason: " + b("getErrorDetails")(d) }; }), a.debugPod = null); }; a.debugTerminal = function(c) { var d = j.generateDebugPod(a.pod, c); return d ? void g.create("pods", null, d, i).then(function(b) { var f = _.find(a.pod.spec.containers, { name:c }); a.debugPod = b, $(window).on("beforeunload.debugPod", function() { return "Are you sure you want to leave with the debug terminal open? The debug pod will not be deleted unless you close the dialog."; }), k = g.watchObject("pods", d.metadata.name, i, function(b) { a.debugPod = b; }); var h = e.open({ animation:!0, templateUrl:"views/modals/debug-terminal.html", controller:"DebugTerminalModalController", scope:a, resolve:{ container:function() { return f; }, image:function() { return _.get(a, [ "imagesByDockerReference", f.image ]); } }, backdrop:"static" }); h.result.then(n); }, function(d) { a.alerts["debug-container-error"] = { type:"error", message:"Could not debug container " + c, details:"Reason: " + b("getErrorDetails")(d) }; }) :void (a.alerts["debug-container-error"] = { type:"error", message:"Could not debug container " + c }); }, a.containersRunning = function(a) { var b = 0; return a && a.forEach(function(a) { a.state && a.state.running && b++; }), b; }, a.showDebugAction = function(c) { if ("Completed" === _.get(a, "pod.status.phase")) return !1; if (z(a.pod, "openshift.io/build.name")) return !1; if (b("isDebugPod")(a.pod)) return !1; var d = _.get(c, "state.waiting.reason"); return "ImagePullBackOff" !== d && "ErrImagePull" !== d && (!_.get(c, "state.running") || !c.ready); }, a.$on("$destroy", function() { g.unwatchAll(l), n(), $(window).off("resize.terminalsize"); }); })); } ]), angular.module("openshiftConsole").controller("OverviewController", [ "$filter", "$routeParams", "$scope", "AlertMessageService", "BuildsService", "DataService", "DeploymentsService", "LabelsService", "Logger", "PodsService", "ProjectsService", "RoutesService", "ServicesService", "Navigate", "MetricsService", "QuotaService", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) { c.projectName = b.project, c.renderOptions = c.renderOptions || {}, c.renderOptions.showLoading = !0, c.renderOptions.showGetStarted = !1, c.alerts = c.alerts || {}, d.getAlerts().forEach(function(a) { c.alerts[a.name] = a.data; }), d.clearAlerts(); var q, r, s, t, u, v, w, x, y, z, A, B, C, D = [], E = a("isJenkinsPipelineStrategy"), F = a("annotation"), G = a("label"), H = a("imageObjectRef"), I = a("isRecentDeployment"), J = {}, K = {}, L = function() { J = {}, _.each(q, function(a) { var b = _.get(a, "spec.alternateBackends", []), c = _.filter(b, { kind:"Service" }); if (!_.isEmpty(c)) { var d = _.get(a, "spec.to.name"); K[d] = !0, _.each(c, function(a) { J[a.name] = !0; }); } }); }, M = function(a) { var b = _.get(a, "metadata.name"); return _.has(K, b); }, N = function(a) { var b = _.get(a, "metadata.name"); return _.has(J, b); }, O = function() { c.routesByService = l.groupByService(q), L(); }, P = function() { r && t && (c.deploymentConfigs = t, c.deploymentConfigsByService = h.groupBySelector(t, r, { matchTemplate:!0 })); }, Q = function() { r && s && (c.deployments = s, c.deploymentsByService = h.groupBySelector(s, r, { matchTemplate:!0 })); }, R = function(a) { if (_.get(a, "status.replicas")) return !0; var b = F(a, "deploymentConfig"); if (!b) return !0; if (!t) return !1; var c = t[b]; return !!c && I(a, c); }, S = a("mostRecent"), T = function() { if (u) { v = g.groupByDeploymentConfig(u); var a = {}, b = {}; _.each(v, function(c, d) { a[d] = g.getActiveDeployment(c), b[d] = S(c); }), c.scalableReplicationControllerByDC = a, c.mostRecentReplicationControllerByDC = b, c.vanillaReplicationControllersByService = h.groupBySelector(v[""], r, { matchTemplate:!0 }), c.visibleRCByDC = {}, _.each(v, function(a, b) { c.visibleRCByDC[b] = _.filter(a, R); }); } }, U = function() { r && u && (c.replicationControllersByService = h.groupBySelector(u, r, { matchTemplate:!0 })); }, V = function() { r && w && (c.replicaSetsByService = h.groupBySelector(w, r, { matchTemplate:!0 })); }, W = function(a, b) { if (_.get(a, "status.replicas")) return !0; var c = g.getRevision(a); return !c || !!b && g.getRevision(b) === c; }, X = function() { if (w && s) { c.replicaSetsByDeployment = h.groupBySelector(w, s, { matchSelector:!0 }); var a = {}; _.each(c.replicaSetsByDeployment, function(b, c) { var d = _.get(s, [ c ]); a[c] = g.getActiveReplicaSet(b, d); }), c.scalableReplicaSetsByDeployment = a, c.visibleRSByDeploymentAndService = {}, _.each(c.replicaSetsByService, function(a, b) { c.visibleRSByDeploymentAndService[b] = {}; var d = h.groupBySelector(a, s, { matchSelector:!0 }); _.each(d, function(a, d) { c.visibleRSByDeploymentAndService[b][d] = _.filter(a, function(a) { var b = s[d]; return W(a, b); }); }); }); } }, Y = function() { r && x && (c.petSetsByService = h.groupBySelector(x, r, { matchTemplate:!0 })); }, Z = function() { C = {}, _.each(B, function(a) { var b = a.spec.scaleRef.name, c = a.spec.scaleRef.kind; b && c && (_.has(C, [ c, b ]) || _.set(C, [ c, b ], []), C[c][b].push(a)); }); }, $ = function(a) { return "Succeeded" !== a.status.phase && "Terminated" !== a.status.phase && (!G(a, "openshift.io/deployer-pod-for.name") && (!F(a, "openshift.io/build.name") && "slave" !== G(a, "jenkins"))); }, aa = function() { if (y && u && w && x) { var a = _.toArray(u).concat(_.toArray(w)).concat(_.toArray(x)); c.podsByOwnerUID = h.groupBySelector(y, a, { key:"metadata.uid" }); var b = c.podsByOwnerUID[""]; c.monopodsByService = h.groupBySelector(b, r, { include:$ }); } }, ba = {}, ca = function(a) { return !!ba[a.metadata.name]; }, da = function(a) { var b = _.get(a, "metadata.name"); if (!b) return !1; var d = _.get(c, [ "childServicesByParent", b ], []); return !_.isEmpty(d); }, ea = function(a, b) { var d = r[b]; ba[b] = d, c.childServicesByParent[a] = c.childServicesByParent[a] || [], c.childServicesByParent[a].push(d); }, fa = {}; c.isDuplicateApp = function(a) { return _.size(fa[a]) > 1; }; var ga = function() { r && q && (c.services = r, ba = {}, c.childServicesByParent = {}, _.each(r, function(a, b) { var c = m.getDependentServices(a); _.each(c, function(a) { ea(b, a); }); }), fa = {}, c.topLevelServices = _.chain(r).filter(function(a) { return !!da(a) || (!!M(a) || !ca(a) && !N(a)); }).sortByAll([ "metadata.labels.app", "metadata.name" ]).value(), _.each(c.topLevelServices, function(a) { var b = _.get(a, "metadata.labels.app"); b && _.set(fa, [ b, a.metadata.name ], a); })); }, ha = function() { r && q && (c.routeWarningsByService = {}, _.each(r, function(a) { _.each(c.routesByService[a.metadata.name], function(b) { var d = l.getRouteWarnings(b, a); _.set(c, [ "routeWarningsByService", a.metadata.name, b.metadata.name ], d); }); })); }, ia = function(a) { var b = H(_.get(a, "spec.output.to"), a.metadata.namespace); c.recentBuildsByOutputImage[b] = c.recentBuildsByOutputImage[b] || [], c.recentBuildsByOutputImage[b].push(a); }, ja = a("buildConfigForBuild"), ka = a("isIncompleteBuild"), la = function(a) { if (z) { var b = ja(a), d = z[b]; if (d) { var f = e.usesDeploymentConfigs(d); _.each(f, function(b) { c.recentPipelinesByDC[b] = c.recentPipelinesByDC[b] || [], c.recentPipelinesByDC[b].push(a), ka(a) && (c.incompletePipelinesByDC[b] = c.incompletePipelinesByDC[b] || [], c.incompletePipelinesByDC[b].push(a)); }); } } }, ma = function() { A && (c.recentPipelinesByDC = {}, c.incompletePipelinesByDC = {}, c.recentBuildsByOutputImage = {}, _.each(e.interestingBuilds(A), function(a) { return E(a) ? void la(a) :void ia(a); }), c.pipelinesForDC = {}, _.each(z, function(a) { _.each(e.usesDeploymentConfigs(a), function(b) { c.pipelinesForDC[b] = c.pipelinesForDC[b] || [], c.pipelinesForDC[b].push(a); }); })); }, na = function() { var a = _.isEmpty(r) && _.isEmpty(t) && _.isEmpty(c.monopodsByService) && _.isEmpty(u) && _.isEmpty(w) && _.isEmpty(x), b = r && y && u && w && x; c.renderOptions.showGetStarted = b && a, c.renderOptions.showLoading = !b && a; }, oa = function() { var a = d.isAlertPermanentlyHidden("overview-quota-limit-reached", c.projectName); if (!a && p.isAnyQuotaExceeded(c.quotas, c.clusterQuotas)) { if (c.alerts.quotaExceeded) return; c.alerts.quotaExceeded = { type:"warning", message:"Quota limit has been reached.", links:[ { href:"project/" + c.projectName + "/quota", label:"View Quota" }, { href:"", label:"Don't Show Me Again", onClick:function() { return d.permanentlyHideAlert("overview-quota-limit-reached", c.projectName), !0; } } ] }; } else delete c.alerts.quotaExceeded; }; c.viewPodsForDeployment = function(a) { _.isEmpty(c.podsByOwnerUID[a.metadata.uid]) || n.toPodsForDeployment(a); }, c.isScalableReplicationController = function(a) { return g.isScalable(a, t, _.get(C, "DeploymentConfig"), _.get(C, "ReplicationController"), c.scalableReplicationControllerByDC); }, c.isDeploymentLatest = function(a) { var b = F(a, "deploymentConfig"); if (!b) return !0; if (!t) return !1; var c = parseInt(F(a, "deploymentVersion")); return _.some(t, function(a) { return a.metadata.name === b && a.status.latestVersion === c; }); }, c.hasUnservicedContent = function() { var a = [ "monopodsByService", "deploymentConfigsByService", "deploymentsByService", "replicationControllersByService", "replicaSetsByService", "petSetsByService" ]; return _.some(a, function(a) { var b = _.get(c, [ a, "" ], {}); return !_.isEmpty(b); }); }; var pa = []; c.getHPA = function(a) { if (!B) return null; var b = _.get(a, "kind"), c = _.get(a, "metadata.name"); return _.get(C, [ b, c ], pa); }, window.OPENSHIFT_CONSTANTS.DISABLE_OVERVIEW_METRICS || (o.isAvailable(!0).then(function(a) { c.showMetrics = a; }), c.$on("metrics-connection-failed", function(a, b) { var e = d.isAlertPermanentlyHidden("metrics-connection-failed"); e || c.alerts["metrics-connection-failed"] || (c.alerts["metrics-connection-failed"] = { type:"warning", message:"An error occurred getting metrics.", links:[ { href:b.url, label:"Open Metrics URL", target:"_blank" }, { href:"", label:"Don't Show Me Again", onClick:function() { return d.permanentlyHideAlert("metrics-connection-failed"), !0; } } ] }); })); var qa = a("isIE")() || a("isEdge")(); k.get(b.project).then(_.spread(function(a, b) { c.project = a, c.projectContext = b, D.push(f.watch("pods", b, function(a) { y = a.by("metadata.name"), aa(), na(), i.log("pods", y); })), D.push(f.watch("services", b, function(a) { c.services = r = a.by("metadata.name"), ga(), aa(), P(), U(), T(), V(), Y(), ha(), na(), i.log("services (subscribe)", r); }, { poll:qa, pollInterval:6e4 })), D.push(f.watch("builds", b, function(a) { A = a.by("metadata.name"), ma(), na(), i.log("builds (subscribe)", A); })), D.push(f.watch("buildConfigs", b, function(a) { z = a.by("metadata.name"), ma(), i.log("builds (subscribe)", A); }, { poll:qa, pollInterval:6e4 })), D.push(f.watch("routes", b, function(a) { q = a.by("metadata.name"), O(), ga(), ha(), i.log("routes (subscribe)", c.routesByService); }, { poll:qa, pollInterval:6e4 })), D.push(f.watch("replicationcontrollers", b, function(a) { c.replicationControllersByName = u = a.by("metadata.name"), U(), T(), aa(), ma(), na(), i.log("replicationcontrollers (subscribe)", u); })), D.push(f.watch("deploymentconfigs", b, function(a) { t = a.by("metadata.name"), P(), T(), na(), i.log("deploymentconfigs (subscribe)", t); })), D.push(f.watch({ group:"extensions", resource:"replicasets" }, b, function(a) { w = a.by("metadata.name"), aa(), V(), X(), na(), i.log("replicasets (subscribe)", w); })), D.push(f.watch({ group:"apps", resource:"petsets" }, b, function(a) { x = a.by("metadata.name"), aa(), Y(), na(), i.log("petsets (subscribe)", x); }, { poll:qa, pollInterval:6e4 })), D.push(f.watch({ group:"extensions", resource:"deployments" }, b, function(a) { s = a.by("metadata.name"), Q(), X(), na(), i.log("deployments (subscribe)", s); })), D.push(f.watch({ group:"extensions", resource:"horizontalpodautoscalers" }, b, function(a) { B = a.by("metadata.name"), Z(); }, { poll:qa, pollInterval:6e4 })), D.push(f.watch("resourcequotas", b, function(a) { c.quotas = a.by("metadata.name"), oa(); }, { poll:!0, pollInterval:6e4 })), D.push(f.watch("appliedclusterresourcequotas", b, function(a) { c.clusterQuotas = a.by("metadata.name"), oa(); }, { poll:!0, pollInterval:6e4 })), f.list("limitranges", b, function(a) { c.limitRanges = a.by("metadata.name"); }), c.$on("$destroy", function() { f.unwatchAll(D); }); })); } ]), angular.module("openshiftConsole").controller("TopologyController", [ "$routeParams", "$scope", "DataService", "DeploymentsService", "ProjectsService", "annotationFilter", "hashSizeFilter", "imageObjectRefFilter", "deploymentCausesFilter", "labelFilter", "LabelFilter", "Logger", "ImageStreamResolver", "ObjectDescriber", "$parse", "$filter", "$interval", "RoutesService", "AlertMessageService", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) { b.projectName = a.project, b.pods = {}, b.services = {}, b.routes = {}, b.routesByService = {}, b.displayRouteByService = {}, b.unfilteredServices = {}, b.deployments = {}, b.deploymentConfigs = void 0, b.builds = {}, b.imageStreams = {}, b.imagesByDockerReference = {}, b.imageStreamImageRefByDockerReference = {}, b.podsByService = {}, b.podsByDeployment = {}, b.monopodsByService = {}, b.deploymentsByServiceByDeploymentConfig = {}, b.deploymentsByService = {}, b.deploymentConfigsByService = {}, b.recentBuildsByOutputImage = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", b.renderOptions = b.renderOptions || {}, b.renderOptions.showToolbar = !1, b.renderOptions.showSidebarRight = !1, b.renderOptions.showGetStarted = !1, b.overviewMode = "tiles", b.routeWarningsByService = {}; var t = {}; b.topologyKinds = { DeploymentConfig:location.href + "#vertex-DeploymentConfig", Pod:location.href + "#vertex-Pod", ReplicationController:location.href + "#vertex-ReplicationController", Route:location.href + "#vertex-Route", Service:location.href + "#vertex-Service" }, b.topologySelection = null, b.topologyItems = {}, b.topologyRelations = [], b.alerts = b.alerts || {}, s.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), s.clearAlerts(); var u = [], v = []; e.get(a.project).then(_.spread(function(a, e) { function s() { b.monopodsByService = { "":{} }, b.podsByService = {}, b.podsByDeployment = {}; var a = {}; angular.forEach(b.deployments, function(c, d) { a[d] = new LabelSelector(c.spec.selector), b.podsByDeployment[d] = {}; }); var c = {}; angular.forEach(b.unfilteredServices, function(a, d) { c[d] = new LabelSelector(a.spec.selector), b.podsByService[d] = {}; }), angular.forEach(b.pods, function(d, e) { var f = [], g = []; angular.forEach(b.deployments, function(c, g) { var h = a[g]; h.matches(d) && (f.push(g), b.podsByDeployment[g][e] = d); }), angular.forEach(b.unfilteredServices, function(a, h) { var i = c[h]; if (i.matches(d)) { g.push(h), b.podsByService[h][e] = d; var j = !1; angular.forEach(f, function(a) { j = j || b.deploymentsByService[h] && b.deploymentsByService[h][a]; }), j || (b.monopodsByService[h] = b.monopodsByService[h] || {}, b.monopodsByService[h][e] = d); } }), 0 === f.length && 0 === g.length && w(d) && (b.monopodsByService[""][e] = d); }), l.log("podsByDeployment", b.podsByDeployment), l.log("podsByService", b.podsByService), l.log("monopodsByService", b.monopodsByService), E(); } function w(a) { return "Succeeded" !== a.status.phase && "Terminated" !== a.status.phase && "Failed" !== a.status.phase && (!j(a, "openshift.io/deployer-pod-for.name") && !f(a, "openshift.io/build.name")); } function x() { b.deploymentConfigsByService = { "":{} }, angular.forEach(b.deploymentConfigs, function(a, c) { var d = !1, e = o("spec.template.metadata.labels"), f = new LabelSelector(e(a) || {}); angular.forEach(b.unfilteredServices, function(e, g) { b.deploymentConfigsByService[g] = b.deploymentConfigsByService[g] || {}; var h = new LabelSelector(e.spec.selector); h.covers(f) && (b.deploymentConfigsByService[g][c] = a, d = !0); }), d || (b.deploymentConfigsByService[""][c] = a); }); } function y(a) { t = {}, angular.forEach(a, function(a, b) { t[b] = d.getActiveDeployment(a); }); } function z() { var a = b.deploymentsByService = { "":{} }, c = b.deploymentsByServiceByDeploymentConfig = { "":{} }; K = {}, angular.forEach(b.deployments, function(d, e) { var g = !1, h = o("spec.template.metadata.labels"), i = new LabelSelector(h(d) || {}), j = f(d, "deploymentConfig") || ""; j && (K[j] = K[j] || [], K[j].push(d)), angular.forEach(b.unfilteredServices, function(b, f) { a[f] = a[f] || {}, c[f] = c[f] || {}; var h = new LabelSelector(b.spec.selector); h.covers(i) && (a[f][e] = d, c[f][j] = c[f][j] || {}, c[f][j][e] = d, g = !0); }), g || (a[""][e] = d, c[""][j] = c[""][j] || {}, c[""][j][e] = d); }); } function A() { b.recentBuildsByOutputImage = {}, b.recentPipelineBuilds = [], angular.forEach(b.builds, function(a) { if (p("isRecentBuild")(a) || p("isOscActiveObject")(a)) { var c = h(a.spec.output.to, a.metadata.namespace); b.recentBuildsByOutputImage[c] = b.recentBuildsByOutputImage[c] || [], b.recentBuildsByOutputImage[c].push(a), L(a) && b.recentPipelineBuilds.push(a); } }); } function B() { var a = 0 === g(b.unfilteredServices) && 0 === g(b.pods) && 0 === g(b.deployments) && 0 === g(b.deploymentConfigs) && 0 === g(b.builds); b.renderOptions.showToolbar = !a, b.renderOptions.showSidebarRight = !a, b.renderOptions.showGetStarted = a; } function C() { k.getLabelSelector().isEmpty() || !$.isEmptyObject(b.services) || $.isEmptyObject(b.unfilteredServices) ? delete b.alerts.services :b.alerts.services = { type:"warning", details:"The active filters are hiding all services." }; } function D() { function a(a) { return a.kind + a.metadata.uid; } M = null; var c = [], d = {}; angular.forEach(b.services, function(b) { d[a(b)] = b; }); var e = p("isRecentDeployment"); b.isVisibleDeployment = function(a) { var c = f(a, "deploymentConfig"); if (!c) return !0; if (g(b.podsByDeployment[a.metadata.name]) > 0) return !0; if (!b.deploymentConfigs) return !1; var d = b.deploymentConfigs[c]; return !!d && (e(a, d) || b.isScalable(a, c)); }, [ b.podsByService, b.monopodsByService, b.deploymentsByService, b.deploymentConfigsByService, b.routesByService ].forEach(function(c) { angular.forEach(c, function(e, f) { var g = b.services[f]; f && !g || angular.forEach(e, function(e) { (c !== b.monopodsByService || w(e)) && (c !== b.deploymentsByService || b.isVisibleDeployment(e)) && (d[a(e)] = e); }); }); }), [ b.podsByService, b.monopodsByService, b.routesByService ].forEach(function(d) { angular.forEach(d, function(d, e) { var f = b.services[e]; f && angular.forEach(d, function(b) { c.push({ source:a(f), target:a(b) }); }); }); }), angular.forEach(b.podsByDeployment, function(e, f) { var g = b.deployments[f]; a(g) in d && angular.forEach(e, function(b) { d[a(b)] = b, c.push({ source:a(g), target:a(b) }); }); }), angular.forEach(b.deployments, function(d, e) { var f, g = d.metadata.annotations || {}, h = g["openshift.io/deployment-config.name"] || e; h && b.deploymentConfigs && (f = b.deploymentConfigs[h], f && c.push({ source:a(f), target:a(d) })); }), b.$evalAsync(function() { b.topologyItems = d, b.topologyRelations = c; }); } function E() { M || (M = window.setTimeout(D, 100)); } function F(a) { b.topologySelection = a; } b.project = a, v.push(c.watch("pods", e, function(a) { b.pods = a.by("metadata.name"), s(), B(), m.fetchReferencedImageStreamImages(b.pods, b.imagesByDockerReference, b.imageStreamImageRefByDockerReference, e), E(), l.log("pods", b.pods); })), v.push(c.watch("services", e, function(a) { b.unfilteredServices = a.by("metadata.name"), k.addLabelSuggestionsFromResources(b.unfilteredServices, b.labelSuggestions), k.setLabelSuggestions(b.labelSuggestions), b.services = k.getLabelSelector().select(b.unfilteredServices), z(), x(), s(), B(), angular.forEach(b.unfilteredServices, function(a, c) { b.routeWarningsByService[c] = {}, angular.forEach(b.routesByService[c], function(d, e) { var f = r.getRouteWarnings(d, a); f.length && (b.routeWarningsByService[c][e] = r.getRouteWarnings(d, a)); }); }), b.emptyMessage = "There are no services and no running deployments or pods.", C(), E(), l.log("services (list)", b.services); })), v.push(c.watch("routes", e, function(a) { b.routes = a.by("metadata.name"); var c = b.routesByService = {}, d = b.displayRouteByService = {}; angular.forEach(b.routes, function(a, e) { if ("Service" === a.spec.to.kind) { var f = a.spec.to.name; if (c[f] = c[f] || {}, c[f][e] = a, b.unfilteredServices[f]) { b.routeWarningsByService[f] = b.routeWarningsByService[f] || {}; var g = r.getRouteWarnings(a, b.unfilteredServices[f]); g.length ? b.routeWarningsByService[f][e] = g :delete b.routeWarningsByService[f][e]; } d[f] ? d[f] = r.getPreferredDisplayRoute(d[f], a) :d[f] = a; } }), E(), l.log("routes (subscribe)", b.routesByService); })); var G, H, I = function(a) { var b = _.get(b, [ a ]); return !_.isEmpty(b); }, J = function(a) { var b = _.get(H, [ a ]); return !_.isEmpty(b); }; b.getHPA = function(a, b) { return G && H ? b ? (G[b] = G[b] || [], G[b]) :(H[a] = H[a] || [], H[a]) :null; }, v.push(c.watch({ group:"extensions", resource:"horizontalpodautoscalers" }, e, function(a) { G = {}, H = {}, angular.forEach(a.by("metadata.name"), function(a) { var b = a.spec.scaleRef.name, c = a.spec.scaleRef.kind; if (b && c) switch (c) { case "DeploymentConfig": G[b] = G[b] || [], G[b].push(a); break; case "ReplicationController": H[b] = H[b] || [], H[b].push(a); break; default: l.warn("Unexpected HPA scaleRef kind", c); } }); })), b.isScalable = function(a, c) { return !J(a.metadata.name) && (!c || !!b.deploymentConfigs && (!b.deploymentConfigs[c] || !I(c) && t[c] === a)); }; var K = {}; v.push(c.watch("replicationcontrollers", e, function(a, c, d) { b.deployments = a.by("metadata.name"), d ? "DELETED" !== c && (d.causes = i(d)) :angular.forEach(b.deployments, function(a) { a.causes = i(a); }), z(), s(), y(K), B(), E(), l.log("deployments (subscribe)", b.deployments); })), v.push(c.watch("imagestreams", e, function(a) { b.imageStreams = a.by("metadata.name"), m.buildDockerRefMapForImageStreams(b.imageStreams, b.imageStreamImageRefByDockerReference), m.fetchReferencedImageStreamImages(b.pods, b.imagesByDockerReference, b.imageStreamImageRefByDockerReference, e), E(), l.log("imagestreams (subscribe)", b.imageStreams); })), v.push(c.watch("deploymentconfigs", e, function(a) { b.deploymentConfigs = a.by("metadata.name"), x(), B(), E(), l.log("deploymentconfigs (subscribe)", b.deploymentConfigs); })); var L = p("isJenkinsPipelineStrategy"); v.push(c.watch("builds", e, function(a) { b.builds = a.by("metadata.name"), A(), u.push(q(A, 3e5)), E(), l.log("builds (subscribe)", b.builds); })), c.list("limitranges", e, function(a) { b.limitRanges = a.by("metadata.name"); }), k.onActiveFiltersChanged(function(a) { b.$apply(function() { b.services = a.select(b.unfilteredServices), C(), D(); }); }); var M = null; b.$on("select", function(a, c) { b.$apply(function() { b.topologySelection = c, c ? n.setObject(c, c.kind) :n.clearObject(); }); }, !0), n.onResourceChanged(F), b.$watch("overviewMode", function(a) { "topology" === a && (n.source = null); }), b.$on("$destroy", function() { c.unwatchAll(v), window.clearTimeout(M), n.removeResourceChangedCallback(F), angular.forEach(u, function(a) { q.cancel(a); }); }); })); } ]), angular.module("openshiftConsole").controller("QuotaController", [ "$routeParams", "$scope", "DataService", "ProjectsService", "Logger", function(a, b, c, d, e) { b.projectName = a.project, b.limitRanges = {}, b.limitsByType = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.quotaHelp = "Limits resource usage within this project.", b.emptyMessageLimitRanges = "Loading...", b.limitRangeHelp = "Defines minimum and maximum constraints for runtime resources such as memory and CPU.", b.renderOptions = b.renderOptions || {}, b.renderOptions.hideFilterWidget = !0; var f = []; d.get(a.project).then(_.spread(function(d, g) { b.project = d, c.list("resourcequotas", g, function(a) { b.quotas = a.by("metadata.name"), e.log("quotas", b.quotas); }), c.list("appliedclusterresourcequotas", g, function(c) { b.clusterQuotas = c.by("metadata.name"), b.namespaceUsageByClusterQuota = {}, _.each(b.clusterQuotas, function(c, d) { if (c.status) { var e = _.find(c.status.namespaces, { namespace:a.project }); b.namespaceUsageByClusterQuota[d] = e.status; } }), e.log("cluster quotas", b.clusterQuotas); }), c.list("limitranges", g, function(a) { b.limitRanges = a.by("metadata.name"), b.emptyMessageLimitRanges = "There are no limit ranges set on this project.", angular.forEach(b.limitRanges, function(a, c) { b.limitsByType[c] = {}, angular.forEach(a.spec.limits, function(a) { var d = b.limitsByType[c][a.type] = {}; angular.forEach(a.max, function(a, b) { d[b] = d[b] || {}, d[b].max = a; }), angular.forEach(a.min, function(a, b) { d[b] = d[b] || {}, d[b].min = a; }), angular.forEach(a["default"], function(a, b) { d[b] = d[b] || {}, d[b]["default"] = a; }), angular.forEach(a.defaultRequest, function(a, b) { d[b] = d[b] || {}, d[b].defaultRequest = a; }), angular.forEach(a.maxLimitRequestRatio, function(a, b) { d[b] = d[b] || {}, d[b].maxLimitRequestRatio = a; }); }); }), e.log("limitRanges", b.limitRanges); }), b.$on("$destroy", function() { c.unwatchAll(f); }); })); } ]), angular.module("openshiftConsole").controller("MonitoringController", [ "$routeParams", "$location", "$scope", "$filter", "BuildsService", "DataService", "ImageStreamResolver", "KeywordService", "LabelsService", "Logger", "MetricsService", "Navigate", "PodsService", "ProjectsService", "$rootScope", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) { c.projectName = a.project, c.alerts = c.alerts || {}, c.renderOptions = c.renderOptions || {}, c.renderOptions.showEventsSidebar = !0, c.renderOptions.collapseEventsSidebar = "true" === localStorage.getItem("monitoring.eventsidebar.collapsed"); var p = []; c.kinds = [ { kind:"All" }, { kind:"Pods" }, { label:"Deployments", kind:"ReplicationControllers" }, { kind:"Builds" } ], c.kindSelector = { selected:_.find(c.kinds, { kind:a.kind }) || _.head(c.kinds) }, c.logOptions = { pods:{}, replicationControllers:{}, builds:{} }, c.logCanRun = { pods:{}, replicationControllers:{}, builds:{} }, c.logEmpty = { pods:{}, replicationControllers:{}, builds:{} }, c.expanded = { pods:{}, replicationControllers:{}, replicaSets:{}, builds:{} }; var q = d("isNil"); c.filters = { hideOlderResources:q(a.hideOlderResources) || "true" === a.hideOlderResources, text:"" }; var r, s, t, u; k.isAvailable().then(function(a) { c.metricsAvailable = a; }); var v = d("orderObjectsByDate"), w = [ "metadata.name" ], x = [], y = function() { c.filteredPods = h.filterForKeywords(u, w, x), c.filteredReplicationControllers = h.filterForKeywords(s, w, x), c.filteredReplicaSets = h.filterForKeywords(t, w, x), c.filteredBuilds = h.filterForKeywords(r, w, x); }, z = function(a) { c.logOptions.pods[a.metadata.name] = { container:a.spec.containers[0].name }, c.logCanRun.pods[a.metadata.name] = !_.includes([ "New", "Pending", "Unknown" ], a.status.phase); }, A = function(a) { c.logOptions.replicationControllers[a.metadata.name] = {}; var b = d("annotation")(a, "deploymentVersion"); b && (c.logOptions.replicationControllers[a.metadata.name].version = b), c.logCanRun.replicationControllers[a.metadata.name] = !_.includes([ "New", "Pending" ], d("deploymentStatus")(a)); }, B = function(a) { c.logOptions.builds[a.metadata.name] = {}, c.logCanRun.builds[a.metadata.name] = !_.includes([ "New", "Pending", "Error" ], a.status.phase); }, C = function() { u = _.filter(c.pods, function(a) { return !c.filters.hideOlderResources || "Succeeded" !== a.status.phase && "Failed" !== a.status.phase; }), c.filteredPods = h.filterForKeywords(u, w, x); }, D = d("isIncompleteBuild"), E = d("buildConfigForBuild"), F = d("isRecentBuild"), G = function() { moment().subtract(5, "m"); r = _.filter(c.builds, function(a) { if (!c.filters.hideOlderResources) return !0; if (D(a)) return !0; var b = E(a); return b ? c.latestBuildByConfig[b].metadata.name === a.metadata.name :F(a); }), c.filteredBuilds = h.filterForKeywords(r, w, x); }, H = d("deploymentStatus"), I = d("deploymentIsInProgress"), J = function() { s = _.filter(c.replicationControllers, function(a) { return !c.filters.hideOlderResources || (I(a) || "Active" === H(a)); }), c.filteredReplicationControllers = h.filterForKeywords(s, w, x); }, K = function() { t = _.filter(c.replicaSets, function(a) { return !c.filters.hideOlderResources || _.get(a, "status.replicas"); }), c.filteredReplicaSets = h.filterForKeywords(t, w, x); }; c.toggleItem = function(a, b, e) { var f = $(a.target); if (!f || !f.closest("a", b).length) { var g, h; switch (e.kind) { case "Build": g = !c.expanded.builds[e.metadata.name], c.expanded.builds[e.metadata.name] = g, h = g ? "event.resource.highlight" :"event.resource.clear-highlight", o.$emit(h, e); var i = _.get(c.podsByName, d("annotation")(e, "buildPod")); i && o.$emit(h, i); break; case "ReplicationController": g = !c.expanded.replicationControllers[e.metadata.name], c.expanded.replicationControllers[e.metadata.name] = g, h = g ? "event.resource.highlight" :"event.resource.clear-highlight", o.$emit(h, e); var j = d("annotation")(e, "deployerPod"); j && o.$emit(h, { kind:"Pod", metadata:{ name:j } }), _.each(c.podsByOwnerUID[e.metadata.uid], function(a) { o.$emit(h, a); }); break; case "ReplicaSet": g = !c.expanded.replicaSets[e.metadata.name], c.expanded.replicaSets[e.metadata.name] = g, h = g ? "event.resource.highlight" :"event.resource.clear-highlight", o.$emit(h, e), _.each(c.podsByOwnerUID[e.metadata.uid], function(a) { o.$emit(h, a); }); break; case "Pod": g = !c.expanded.pods[e.metadata.name], c.expanded.pods[e.metadata.name] = g, h = g ? "event.resource.highlight" :"event.resource.clear-highlight", o.$emit(h, e); } } }, c.viewPodsForReplicaSet = function(a) { _.isEmpty(c.podsByOwnerUID[a.metadata.uid]) || l.toPodsForDeployment(a); }; var L = function() { if (c.pods && c.replicationControllers && c.replicaSets) { var a = _.toArray(c.replicationControllers).concat(_.toArray(c.replicaSets)); c.podsByOwnerUID = i.groupBySelector(c.pods, a, { key:"metadata.uid" }); } }; n.get(a.project).then(_.spread(function(a, d) { c.project = a, c.projectContext = d, f.watch("pods", d, function(a) { c.podsByName = a.by("metadata.name"), c.pods = v(c.podsByName, !0), L(), c.podsLoaded = !0, _.each(c.pods, z), C(), j.log("pods", c.pods); }), f.watch("replicationcontrollers", d, function(a) { c.replicationControllers = v(a.by("metadata.name"), !0), L(), c.replicationControllersLoaded = !0, _.each(c.replicationControllers, A), J(), j.log("replicationcontrollers", c.replicationControllers); }), f.watch("builds", d, function(a) { c.builds = v(a.by("metadata.name"), !0), c.latestBuildByConfig = e.latestBuildByConfig(c.builds), c.buildsLoaded = !0, _.each(c.builds, B), G(), j.log("builds", c.builds); }), f.watch({ group:"extensions", resource:"replicasets" }, d, function(a) { c.replicaSets = v(a.by("metadata.name"), !0), L(), c.replicaSetsLoaded = !0, K(), j.log("replicasets", c.replicaSets); }), c.$on("$destroy", function() { f.unwatchAll(p); }), c.$watch("filters.hideOlderResources", function() { C(), G(), J(), K(); var a = b.search(); a.hideOlderResources = c.filters.hideOlderResources ? "true" :"false", b.replace().search(a); }), c.$watch("kindSelector.selected.kind", function() { var a = b.search(); a.kind = c.kindSelector.selected.kind, b.replace().search(a); }), c.$watch("filters.text", _.debounce(function() { c.filterKeywords = x = h.generateKeywords(c.filters.text), c.$apply(y); }, 50, { maxWait:250 })), c.$watch("renderOptions.collapseEventsSidebar", function(a, b) { a !== b && (localStorage.setItem("monitoring.eventsidebar.collapsed", c.renderOptions.collapseEventsSidebar ? "true" :"false"), o.$emit("metrics.charts.resize")); }); })); } ]), angular.module("openshiftConsole").controller("MembershipController", [ "$filter", "$location", "$routeParams", "$scope", "$timeout", "$uibModal", "AuthService", "AuthorizationService", "DataService", "ProjectsService", "MembershipService", "RoleBindingsService", "RolesService", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { var n, o = c.project, p = a("humanizeKind"), q = a("annotation"), r = [], s = { notice:{ yourLastRole:_.template('Removing the role "<%= roleName %>" may completely remove your ability to see this project.') }, warning:{ serviceAccount:_.template("Removing a system role granted to a service account may cause unexpected behavior.") }, remove:{ areYouSure:{ html:{ subject:_.template("Are you sure you want to remove <%- roleName %> from the <%- kindName %> <%- subjectName %>?"), self:_.template("Are you sure you want to remove <%- roleName %> from <%- subjectName %> (you)?") } }, success:_.template('The role "<%= roleName %>" was removed from "<%= subjectName %>".'), error:_.template('The role "<%= roleName %>" was not removed from "<%= subjectName %>".') }, update:{ subject:{ success:_.template('The role "<%= roleName %>" was granted to "<%= subjectName %>".'), error:_.template('The role "<%= roleName %>" could not be granted to "<%= subjectName %>".'), exists:_.template('The role "<%= roleName %>" has already been granted to "<%= subjectName %>".') } }, errorReason:_.template('Reason: "<%= httpErr %>"') }, t = function(a, b, c, e, f) { f = f || d, f.alerts[a] = { type:b, message:c, details:e }; }, u = function() { d.disableAddForm = !1, d.newBinding.name = "", d.newBinding.namespace = o, d.newBinding.newRole = null; }, v = function() { i.list("rolebindings", n, null, { errorNotification:!1 }).then(function(a) { angular.extend(d, { canShowRoles:!0, roleBindings:a.by("metadata.name"), subjectKindsForUI:k.mapRolebindingsForUI(a.by("metadata.name"), r) }), u(); }); }, w = function(b, c) { d.disableAddForm = !0, l.create(b, c, o, n).then(function() { v(), t("rolebindingCreate", "success", s.update.subject.success({ roleName:b.metadata.name, subjectName:c.name })); }, function(d) { u(), t("rolebindingCreateFail", "error", s.update.subject.error({ roleName:b.metadata.name, subjectName:c.name }), s.errorReason({ httpErr:a("getErrorDetails")(d) })); }); }, x = function(b, c, e) { d.disableAddForm = !0, l.addSubject(b, c, e, n).then(function() { v(), t("rolebindingUpdate", "success", s.update.subject.success({ roleName:b.roleRef.name, subjectName:c.name })); }, function(d) { u(), t("rolebindingUpdateFail", "error", s.update.subject.error({ roleName:b.roleRef.name, subjectName:c.name }), s.errorReason({ httpErr:a("getErrorDetails")(d) })); }); }, y = {}; c.tab && (y[c.tab] = !0); var z = k.getSubjectKinds(); angular.extend(d, { selectedTab:y, projectName:o, alerts:{}, forms:{}, emptyMessage:"Loading...", subjectKinds:z, newBinding:{ role:"", kind:c.tab || "User", name:"" }, toggleEditMode:function() { u(), d.mode.edit = !d.mode.edit; }, mode:{ edit:!1 }, selectTab:function(a) { d.newBinding.kind = a; } }), angular.extend(d, { excludeExistingRoles:function(a) { return function(b) { return !_.some(a, { kind:b.kind, metadata:{ name:b.metadata.name } }); }; }, roleHelp:function(a) { if (a) { var b = "", c = _.get(a, "metadata.namespace"), d = _.get(a, "metadata.name"), e = c ? c + " / " + d + ": " :""; return a ? e + (q(a, "description") || b) :b; } } }); var A = function(a, b, c, e) { var f = { alerts:{}, detailsMarkup:s.remove.areYouSure.html.subject({ roleName:c, kindName:p(b), subjectName:a }), okButtonText:"Remove", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }; return _.isEqual(a, e) && (f.detailsMarkup = s.remove.areYouSure.html.self({ roleName:c, subjectName:a }), k.isLastRole(d.user.metadata.name, d.roleBindings) && t("currentUserLastRole", "error", s.notice.yourLastRole({ roleName:c }), null, f)), _.isEqual(b, "ServiceAccount") && _.startsWith(c, "system:") && t("editingServiceAccountRole", "error", s.warning.serviceAccount(), null, f), f; }; g.withUser().then(function(a) { d.user = a; }), i.list("projects", {}).then(function(a) { var b = _.map(a.by("metadata.name"), function(a) { return a.metadata.name; }); angular.extend(d, { projects:b, refreshProjects:function(a) { a && !_.includes(d.projects, a) ? d.projects = [ a ].concat(b) :d.projects = b; } }); }), j.get(c.project).then(_.spread(function(c, e) { n = e, v(), angular.extend(d, { project:c, subjectKinds:z, confirmRemove:function(c, e, g) { var h = null, i = A(c, e, g, d.user.metadata.name); _.isEqual(c, d.user.metadata.name) && k.isLastRole(d.user.metadata.name, d.roleBindings) && (h = !0), f.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return i; } } }).result.then(function() { l.removeSubject(c, g, d.roleBindings, n).then(function() { h ? b.url("./") :(v(), t("rolebindingUpdate", "success", s.remove.success({ roleName:g, subjectName:c }))); }, function(b) { t("rolebindingUpdateFail", "error", s.remove.error({ roleName:g, subjectName:c }), s.errorReason({ httpErr:a("getErrorDetails")(b) })); }); }); }, addRoleTo:function(a, b, c, e) { var f = { name:a, kind:b, namespace:e }, g = _.find(d.roleBindings, { roleRef:{ name:c.metadata.name } }); g && _.some(g.subjects, { name:a }) ? t("rolebindingUpdate", "info", s.update.subject.exists({ roleName:c.metadata.name, subjectName:a })) :g ? x(g, f, e) :w(c, f, e); } }), m.listAllRoles(n, { errorNotification:!1 }).then(function(a) { r = k.mapRolesForUI(_.first(a).by("metadata.name"), _.last(a).by("metadata.name")); var b = k.sortRoles(r), c = k.filterRoles(r), e = function(a, b) { return _.some(b, { metadata:{ name:a } }); }; v(), angular.extend(d, { toggle:{ roles:!1 }, filteredRoles:c, showAllRoles:function() { d.toggle.roles = !d.toggle.roles, d.toggle.roles ? d.filteredRoles = b :(d.filteredRoles = c, e(d.newBinding.role, c) || (d.newBinding.role = null)); } }); }); })); } ]), angular.module("openshiftConsole").controller("BuildsController", [ "$routeParams", "$scope", "AlertMessageService", "DataService", "$filter", "LabelFilter", "Logger", "$location", "BuildsService", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j) { b.projectName = a.project, b.builds = {}, b.unfilteredBuildConfigs = {}, b.buildConfigs = void 0, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", b.latestByConfig = {}, c.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), c.clearAlerts(); var k = e("buildConfigForBuild"), l = []; j.get(a.project).then(_.spread(function(a, c) { function h(a) { var c = f.getLabelSelector(); if (c.isEmpty()) return !0; var d = k(a) || ""; return d && b.unfilteredBuildConfigs[d] ? !!b.buildConfigs[d] :c.matches(a); } function j() { b.latestByConfig = i.latestBuildByConfig(b.builds, h), angular.forEach(b.buildConfigs, function(a, c) { b.latestByConfig[c] = b.latestByConfig[c] || null; }); } function m() { var a = _.omit(b.latestByConfig, _.isNull); !f.getLabelSelector().isEmpty() && _.isEmpty(b.buildConfigs) && _.isEmpty(a) ? b.alerts.builds = { type:"warning", details:"The active filters are hiding all builds." } :delete b.alerts.builds; } b.project = a; var n = e("isJenkinsPipelineStrategy"); l.push(d.watch("builds", c, function(a) { b.builds = _.omit(a.by("metadata.name"), n), b.emptyMessage = "No builds to show", j(), f.addLabelSuggestionsFromResources(b.builds, b.labelSuggestions), g.log("builds (subscribe)", b.builds); })), l.push(d.watch("buildconfigs", c, function(a) { b.unfilteredBuildConfigs = _.omit(a.by("metadata.name"), n), f.addLabelSuggestionsFromResources(b.unfilteredBuildConfigs, b.labelSuggestions), f.setLabelSuggestions(b.labelSuggestions), b.buildConfigs = f.getLabelSelector().select(b.unfilteredBuildConfigs), j(), m(), g.log("buildconfigs (subscribe)", b.buildConfigs); })), f.onActiveFiltersChanged(function(a) { b.$apply(function() { b.buildConfigs = a.select(b.unfilteredBuildConfigs), j(), m(); }); }), b.$on("$destroy", function() { d.unwatchAll(l); }); })); } ]), angular.module("openshiftConsole").controller("PipelinesController", [ "$filter", "$routeParams", "$scope", "Constants", "Navigate", "AlertMessageService", "BuildsService", "DataService", "Logger", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j) { c.projectName = b.project, c.alerts = c.alerts || {}, c.buildConfigs = {}, f.getAlerts().forEach(function(a) { c.alerts[a.name] = a.data; }), f.clearAlerts(); var k = []; j.get(b.project).then(_.spread(function(b, f) { c.project = b; var i = {}, j = a("buildConfigForBuild"), l = a("isIncompleteBuild"), m = a("isJenkinsPipelineStrategy"), n = a("isNewerResource"), o = function(a, b) { if (!l(b)) { c.statsByConfig[a] || (c.statsByConfig[a] = { count:0, totalDuration:0 }); var d = c.statsByConfig[a]; d.count++, d.totalDuration += g.getDuration(b), d.avgDuration = _.round(d.totalDuration / d.count); } }, p = function() { var a = {}, b = {}; c.statsByConfig = {}, _.each(i, function(d) { if (m(d)) { var e = j(d) || ""; c.buildConfigs[e] || (c.buildConfigs[e] = null), l(d) ? _.set(a, [ e, d.metadata.name ], d) :n(d, b[e]) && (b[e] = d), o(e, d); } }), _.each(b, function(b, c) { _.set(a, [ c, b.metadata.name ], b); }), c.interestingBuildsByConfig = a; }; k.push(h.watch("builds", f, function(a) { c.buildsLoaded = !0, i = a.by("metadata.name"), p(); })); var q = !1; k.push(h.watch("buildconfigs", f, function(a) { if (c.buildConfigsLoaded = !0, c.buildConfigs = _.pick(a.by("metadata.name"), m), _.isEmpty(c.buildConfigs) && !q) { q = !0; var b = d.SAMPLE_PIPELINE_TEMPLATE.name, f = d.SAMPLE_PIPELINE_TEMPLATE.namespace; h.get("templates", b, { namespace:f }, { errorNotification:!1 }).then(function() { c.createSampleURL = e.fromTemplateURL(c.projectName, b, f); }); } p(); })), c.startBuild = function(b) { g.startBuild(b, f).then(_.noop, function(b) { c.alerts["start-build"] = { type:"error", message:"An error occurred while starting the build.", details:a("getErrorDetails")(b) }; }); }, c.$on("$destroy", function() { h.unwatchAll(k); }); })); } ]), angular.module("openshiftConsole").controller("BuildConfigController", [ "$scope", "$filter", "$routeParams", "AlertMessageService", "APIService", "BuildsService", "ImagesService", "DataService", "LabelFilter", "ModalsService", "ProjectsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l) { a.projectName = c.project, a.buildConfigName = c.buildconfig, a.buildConfig = null, a.labelSuggestions = {}, a.alerts = {}, a.breadcrumbs = [], a.forms = {}, a.expand = { imageEnv:!1 }, c.isPipeline ? a.breadcrumbs.push({ title:"Pipelines", link:"project/" + c.project + "/browse/pipelines" }) :a.breadcrumbs.push({ title:"Builds", link:"project/" + c.project + "/browse/builds" }), a.breadcrumbs.push({ title:c.buildconfig }), a.emptyMessage = "Loading...", d.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), d.clearAlerts(), a.aceLoaded = function(a) { var b = a.getSession(); b.setOption("tabSize", 2), b.setOption("useSoftTabs", !0), a.$blockScrolling = 1 / 0; }; var m, n = b("orderObjectsByDate"), o = b("buildConfigForBuild"), p = b("buildStrategy"), q = [], r = function(c) { a.updatedBuildConfig = angular.copy(c), a.envVars = p(a.updatedBuildConfig).env || [], _.each(a.envVars, function(a) { b("altTextForValueFrom")(a); }); }; a.saveEnvVars = function() { a.envVars = _.filter(a.envVars, "name"), p(a.updatedBuildConfig).env = l.compactEntries(angular.copy(a.envVars)), h.update("buildconfigs", c.buildconfig, a.updatedBuildConfig, m).then(function() { a.alerts.saveBCEnvVarsSuccess = { type:"success", message:a.buildConfigName + " was updated." }, a.forms.bcEnvVars.$setPristine(); }, function(c) { a.alerts.saveBCEnvVarsError = { type:"error", message:a.buildConfigName + " was not updated.", details:"Reason: " + b("getErrorDetails")(c) }; }); }, a.clearEnvVarUpdates = function() { r(a.buildConfig), a.forms.bcEnvVars.$setPristine(); }; var s, t = function(c, d) { a.loaded = !0, a.buildConfig = c, a.buildConfigPaused = f.isPaused(a.buildConfig), a.buildConfig.spec.source.images && (a.imageSources = a.buildConfig.spec.source.images, a.imageSourcesPaths = [], a.imageSources.forEach(function(c) { a.imageSourcesPaths.push(b("destinationSourcePair")(c.paths)); })); var i = _.get(p(c), "from", {}), j = i.kind + "/" + i.name + "/" + (i.namespace || a.projectName); s !== j && (_.includes([ "ImageStreamTag", "ImageStreamImage" ], i.kind) ? (s = j, h.get(e.kindToResource(i.kind), i.name, { namespace:i.namespace || a.projectName }, { errorNotification:!1 }).then(function(b) { a.BCEnvVarsFromImage = g.getEnvironment(b); }, function() { a.BCEnvVarsFromImage = []; })) :a.BCEnvVarsFromImage = []), r(c), "DELETED" === d && (a.alerts.deleted = { type:"warning", message:"This build configuration has been deleted." }, a.buildConfigDeleted = !0), !a.forms.bcEnvVars || a.forms.bcEnvVars.$pristine ? r(c) :a.alerts.background_update = { type:"warning", message:"This build configuration has been updated in the background. Saving your changes may create a conflict or cause loss of data.", links:[ { label:"Reload Environment Variables", onClick:function() { return a.clearEnvVarUpdates(), !0; } } ] }, a.paused = f.isPaused(a.buildConfig); }; k.get(c.project).then(_.spread(function(d, e) { function g() { i.getLabelSelector().isEmpty() || !$.isEmptyObject(a.builds) || $.isEmptyObject(a.unfilteredBuilds) ? delete a.alerts.builds :a.alerts.builds = { type:"warning", details:"The active filters are hiding all builds." }; } a.project = d, m = e, h.get("buildconfigs", c.buildconfig, e).then(function(a) { t(a), q.push(h.watchObject("buildconfigs", c.buildconfig, e, t)); }, function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:404 === c.status ? "This build configuration can not be found, it may have been deleted." :"The build configuration details could not be loaded.", details:404 === c.status ? "Any remaining build history for this build will be shown." :"Reason: " + b("getErrorDetails")(c) }; }), q.push(h.watch("builds", e, function(b, d, e) { if (a.emptyMessage = "No builds to show", d) { var h = o(e); if (h === c.buildconfig) { var j = e.metadata.name; switch (d) { case "ADDED": case "MODIFIED": a.unfilteredBuilds[j] = e; break; case "DELETED": delete a.unfilteredBuilds[j]; } } } else a.unfilteredBuilds = f.validatedBuildsForBuildConfig(c.buildconfig, b.by("metadata.name")); a.builds = i.getLabelSelector().select(a.unfilteredBuilds), g(), i.addLabelSuggestionsFromResources(a.unfilteredBuilds, a.labelSuggestions), i.setLabelSuggestions(a.labelSuggestions), a.orderedBuilds = n(a.builds, !0), a.latestBuild = a.orderedBuilds.length ? a.orderedBuilds[0] :null; }, { http:{ params:{ labelSelector:b("labelName")("buildConfig") + "=" + _.trunc(a.buildConfigName, { length:63, omission:"" }) } } })), i.onActiveFiltersChanged(function(b) { a.$apply(function() { a.builds = b.select(a.unfilteredBuilds), a.orderedBuilds = n(a.builds, !0), a.latestBuild = a.orderedBuilds.length ? a.orderedBuilds[0] :null, g(); }); }), a.startBuild = function() { f.startBuild(a.buildConfig.metadata.name, e).then(function(b) { a.alerts.create = { type:"success", message:"Build " + b.metadata.name + " has started." }; }, function(c) { a.alerts.create = { type:"error", message:"An error occurred while starting the build.", details:b("getErrorDetails")(c) }; }); }, a.showJenkinsfileExamples = function() { j.showJenkinsfileExamples(); }, a.$on("$destroy", function() { h.unwatchAll(q); }); })); } ]), angular.module("openshiftConsole").controller("BuildController", [ "$scope", "$filter", "$routeParams", "BuildsService", "DataService", "ModalsService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h) { a.projectName = c.project, a.build = null, a.buildConfig = null, a.buildConfigName = c.buildconfig, a.builds = {}, a.alerts = {}, a.showSecret = !1, a.renderOptions = { hideFilterWidget:!0 }, a.breadcrumbs = [], c.isPipeline ? (a.breadcrumbs.push({ title:"Pipelines", link:"project/" + c.project + "/browse/pipelines" }), c.buildconfig && a.breadcrumbs.push({ title:c.buildconfig, link:"project/" + c.project + "/browse/pipelines/" + c.buildconfig })) :(a.breadcrumbs.push({ title:"Builds", link:"project/" + c.project + "/browse/builds" }), c.buildconfig && a.breadcrumbs.push({ title:c.buildconfig, link:"project/" + c.project + "/browse/builds/" + c.buildconfig })), a.breadcrumbs.push({ title:c.build }); var i = [], j = function(b) { a.logCanRun = !_.includes([ "New", "Pending", "Error" ], b.status.phase); }, k = function() { a.buildConfig ? a.canBuild = d.canBuild(a.buildConfig) :a.canBuild = !1; }, l = function(c, d) { a.loaded = !0, a.build = c, j(c); var e = b("annotation")(c, "buildNumber"); e && (a.breadcrumbs[2].title = "#" + e), "DELETED" === d && (a.alerts.deleted = { type:"warning", message:"This build has been deleted." }); }, m = function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:"The build details could not be loaded.", details:"Reason: " + b("getErrorDetails")(c) }; }, n = function(b, c) { "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"Build configuration " + a.buildConfigName + " has been deleted." }, a.buildConfigDeleted = !0), a.buildConfig = b, a.buildConfigPaused = d.isPaused(a.buildConfig), k(); }; h.get(c.project).then(_.spread(function(h, j) { a.project = h, a.projectContext = j, a.logOptions = {}, e.get("builds", c.build, j).then(function(a) { l(a), i.push(e.watchObject("builds", c.build, j, l)), i.push(e.watchObject("buildconfigs", c.buildconfig, j, n)); }, m), a.toggleSecret = function() { a.showSecret = !0; }, a.cancelBuild = function() { d.cancelBuild(a.build, a.buildConfigName, j).then(function(b) { a.alerts.cancel = { type:"success", message:"Cancelled build " + b.metadata.name + " of " + a.buildConfigName + "." }; }, function(c) { a.alerts.cancel = { type:"error", message:"An error occurred cancelling the build.", details:b("getErrorDetails")(c) }; }); }; var k = function(c) { if (b("isJenkinsPipelineStrategy")(a.build) || !b("canI")("builds/log", "get")) return [ { href:g.resourceURL(c), label:"View Build" } ]; var d = b("buildLogURL")(c); return d ? [ { href:d, label:"View Log" } ] :[]; }; a.cloneBuild = function() { var c = _.get(a, "build.metadata.name"); c && a.canBuild && d.cloneBuild(c, j).then(function(b) { var d = k(b); a.alerts.rebuild = { type:"success", message:"Build " + c + " is being rebuilt as " + b.metadata.name + ".", links:d }; }, function(c) { a.alerts.rebuild = { type:"error", message:"An error occurred while rerunning the build.", details:b("getErrorDetails")(c) }; }); }, a.showJenkinsfileExamples = function() { f.showJenkinsfileExamples(); }, a.$on("$destroy", function() { e.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("ImageController", [ "$scope", "$routeParams", "DataService", "ProjectsService", "$filter", "ImageStreamsService", "imageLayers", function(a, b, c, d, e, f, g) { function h(c, d) { var e = f.tagsByName(c); a.imageStream = c, a.tagsByName = e, a.tagName = b.tag; var g = e[b.tag]; return g ? (delete a.alerts.load, void j(g, d)) :void (a.alerts.load = { type:"error", message:"The image tag was not found in the stream." }); } a.projectName = b.project, a.imageStream = null, a.image = null, a.layers = null, a.tagsByName = {}, a.alerts = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.breadcrumbs = [ { title:"Image Streams", link:"project/" + b.project + "/browse/images" }, { title:b.imagestream, link:"project/" + b.project + "/browse/images/" + b.imagestream }, { title:":" + b.tag } ], a.emptyMessage = "Loading..."; var i = [], j = _.debounce(function(d, f) { var h = b.imagestream + ":" + b.tag; c.get("imagestreamtags", h, f).then(function(b) { a.loaded = !0, a.image = b.image, a.layers = g(a.image); }, function(b) { a.loaded = !0, a.alerts.load = { type:"error", message:"The image details could not be loaded.", details:"Reason: " + e("getErrorDetails")(b) }; }); }, 200), k = function(b, c, d) { h(b, c), a.emptyMessage = "", "DELETED" === d && (a.alerts.deleted = { type:"warning", message:"This image stream has been deleted." }); }; d.get(b.project).then(_.spread(function(d, f) { a.project = d, c.get("imagestreams", b.imagestream, f).then(function(a) { k(a, f), i.push(c.watchObject("imagestreams", b.imagestream, f, function(a, b) { k(a, f, b); })); }, function(b) { a.loaded = !0, a.alerts.load = { type:"error", message:"The image stream details could not be loaded.", details:"Reason: " + e("getErrorDetails")(b) }; }), a.$on("$destroy", function() { c.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("ImagesController", [ "$routeParams", "$scope", "AlertMessageService", "DataService", "ProjectsService", "$filter", "LabelFilter", "Logger", function(a, b, c, d, e, f, g, h) { b.projectName = a.project, b.imageStreams = {}, b.unfilteredImageStreams = {}, b.missingStatusTagsByImageStream = {}, b.builds = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", c.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), c.clearAlerts(); var i = []; e.get(a.project).then(_.spread(function(a, c) { function e() { angular.forEach(b.unfilteredImageStreams, function(a, c) { var d = b.missingStatusTagsByImageStream[c] = {}; if (a.spec && a.spec.tags) { var e = {}; a.status && a.status.tags && angular.forEach(a.status.tags, function(a) { e[a.tag] = !0; }), angular.forEach(a.spec.tags, function(a) { e[a.name] || (d[a.name] = a); }); } }); } function f() { g.getLabelSelector().isEmpty() || !$.isEmptyObject(b.imageStreams) || $.isEmptyObject(b.unfilteredImageStreams) ? delete b.alerts.imageStreams :b.alerts.imageStreams = { type:"warning", details:"The active filters are hiding all image streams." }; } b.project = a, i.push(d.watch("imagestreams", c, function(a) { b.unfilteredImageStreams = a.by("metadata.name"), g.addLabelSuggestionsFromResources(b.unfilteredImageStreams, b.labelSuggestions), g.setLabelSuggestions(b.labelSuggestions), b.imageStreams = g.getLabelSelector().select(b.unfilteredImageStreams), b.emptyMessage = "No image streams to show", e(), f(), h.log("image streams (subscribe)", b.imageStreams); })), g.onActiveFiltersChanged(function(a) { b.$apply(function() { b.imageStreams = a.select(b.unfilteredImageStreams), f(); }); }), b.$on("$destroy", function() { d.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("ImageStreamController", [ "$scope", "$routeParams", "DataService", "ProjectsService", "$filter", "ImageStreamsService", function(a, b, c, d, e, f) { a.projectName = b.project, a.imageStream = null, a.tagsByName = {}, a.tagShowOlder = {}, a.alerts = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.breadcrumbs = [ { title:"Image Streams", link:"project/" + b.project + "/browse/images" }, { title:b.imagestream } ], a.emptyMessage = "Loading..."; var g = []; d.get(b.project).then(_.spread(function(d, h) { a.project = d, c.get("imagestreams", b.imagestream, h).then(function(d) { a.loaded = !0, a.imageStream = d, a.emptyMessage = "No tags to show", g.push(c.watchObject("imagestreams", b.imagestream, h, function(b, c) { "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This image stream has been deleted." }), a.imageStream = b, a.tagsByName = f.tagsByName(a.imageStream); })); }, function(b) { a.loaded = !0, a.alerts.load = { type:"error", message:"The image stream details could not be loaded.", details:"Reason: " + e("getErrorDetails")(b) }; }), a.$on("$destroy", function() { c.unwatchAll(g); }); })); } ]), angular.module("openshiftConsole").controller("DeploymentsController", [ "$scope", "$filter", "$routeParams", "AlertMessageService", "DataService", "DeploymentsService", "LabelFilter", "LabelsService", "Logger", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j) { a.projectName = c.project, a.replicationControllers = {}, a.unfilteredDeploymentConfigs = {}, a.unfilteredDeployments = {}, a.replicationControllersByDC = {}, a.labelSuggestions = {}, a.alerts = a.alerts || {}, a.emptyMessage = "Loading...", a.expandedDeploymentConfigRow = {}, a.unfilteredReplicaSets = {}, a.unfilteredReplicationControllers = {}, d.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), d.clearAlerts(); var k, l, m = b("annotation"), n = function() { a.replicaSetsByDeployment = h.groupBySelector(k, l, { matchSelector:!0 }), a.unfilteredReplicaSets = _.get(a, [ "replicaSetsByDeployment", "" ], {}), g.addLabelSuggestionsFromResources(a.unfilteredReplicaSets, a.labelSuggestions), g.setLabelSuggestions(a.labelSuggestions), a.replicaSets = g.getLabelSelector().select(a.unfilteredReplicaSets), a.latestReplicaSetByDeployment = {}, _.each(a.replicaSetsByDeployment, function(b, c) { c && (a.latestReplicaSetByDeployment[c] = f.getActiveReplicaSet(b, l[c])); }); }, o = []; j.get(c.project).then(_.spread(function(c, d) { function h() { var b = !g.getLabelSelector().isEmpty(); if (!b) return void delete a.alerts.deployments; var c = _.isEmpty(a.unfilteredDeploymentConfigs) && _.isEmpty(a.unfilteredReplicationControllers) && _.isEmpty(a.unfilteredDeployments) && _.isEmpty(a.unfilteredReplicaSets); if (c) return void delete a.alerts.deployments; var d = _.isEmpty(a.deploymentConfigs) && _.isEmpty(a.replicationControllersByDC[""]) && _.isEmpty(a.deployments) && _.isEmpty(a.replicaSets); return d ? void (a.alerts.deployments = { type:"warning", details:"The active filters are hiding all deployments." }) :void delete a.alerts.deployments; } a.project = c, o.push(e.watch("replicationcontrollers", d, function(c, d, e) { a.replicationControllers = c.by("metadata.name"); var j, k; if (e && (j = m(e, "deploymentConfig"), k = e.metadata.name), a.replicationControllersByDC = f.associateDeploymentsToDeploymentConfig(a.replicationControllers, a.deploymentConfigs, !0), a.replicationControllersByDC[""] && (a.unfilteredReplicationControllers = a.replicationControllersByDC[""], g.addLabelSuggestionsFromResources(a.unfilteredReplicationControllers, a.labelSuggestions), g.setLabelSuggestions(a.labelSuggestions), a.replicationControllersByDC[""] = g.getLabelSelector().select(a.replicationControllersByDC[""])), h(), d) { if ("ADDED" === d || "MODIFIED" === d && [ "New", "Pending", "Running" ].indexOf(b("deploymentStatus")(e)) > -1) a.deploymentConfigDeploymentsInProgress[j] = a.deploymentConfigDeploymentsInProgress[j] || {}, a.deploymentConfigDeploymentsInProgress[j][k] = e; else if ("MODIFIED" === d) { var l = b("deploymentStatus")(e); "Complete" !== l && "Failed" !== l || delete a.deploymentConfigDeploymentsInProgress[j][k]; } } else a.deploymentConfigDeploymentsInProgress = f.associateRunningDeploymentToDeploymentConfig(a.replicationControllersByDC); e ? "DELETED" !== d && (e.causes = b("deploymentCauses")(e)) :angular.forEach(a.replicationControllers, function(a) { a.causes = b("deploymentCauses")(a); }), i.log("replicationControllers (subscribe)", a.replicationControllers); })), o.push(e.watch({ group:"extensions", resource:"replicasets" }, d, function(b) { k = b.by("metadata.name"), n(), i.log("replicasets (subscribe)", a.replicaSets); })), o.push(e.watch("deploymentconfigs", d, function(b) { a.unfilteredDeploymentConfigs = b.by("metadata.name"), g.addLabelSuggestionsFromResources(a.unfilteredDeploymentConfigs, a.labelSuggestions), g.setLabelSuggestions(a.labelSuggestions), a.deploymentConfigs = g.getLabelSelector().select(a.unfilteredDeploymentConfigs), a.emptyMessage = "No deployment configurations to show", a.replicationControllersByDC = f.associateDeploymentsToDeploymentConfig(a.replicationControllers, a.deploymentConfigs, !0), a.replicationControllersByDC[""] && (a.unfilteredReplicationControllers = a.replicationControllersByDC[""], a.replicationControllersByDC[""] = g.getLabelSelector().select(a.replicationControllersByDC[""])), h(), i.log("deploymentconfigs (subscribe)", a.deploymentConfigs); })), o.push(e.watch({ group:"extensions", resource:"deployments" }, d, function(b) { l = a.unfilteredDeployments = b.by("metadata.name"), g.addLabelSuggestionsFromResources(a.unfilteredDeployments, a.labelSuggestions), g.setLabelSuggestions(a.labelSuggestions), a.deployments = g.getLabelSelector().select(a.unfilteredDeployments), n(), i.log("deployments (subscribe)", a.unfilteredDeployments); })), a.showEmptyMessage = function() { return 0 === b("hashSize")(a.replicationControllersByDC) || !(1 !== b("hashSize")(a.replicationControllersByDC) || !a.replicationControllersByDC[""]); }, g.onActiveFiltersChanged(function(b) { a.$apply(function() { a.deploymentConfigs = b.select(a.unfilteredDeploymentConfigs), a.replicationControllersByDC = f.associateDeploymentsToDeploymentConfig(a.replicationControllers, a.deploymentConfigs, !0), a.replicationControllersByDC[""] && (a.unfilteredReplicationControllers = a.replicationControllersByDC[""], a.replicationControllersByDC[""] = g.getLabelSelector().select(a.replicationControllersByDC[""])), a.deployments = b.select(a.unfilteredDeployments), a.replicaSets = b.select(a.unfilteredReplicaSets), h(); }); }), a.$on("$destroy", function() { e.unwatchAll(o); }); })); } ]), angular.module("openshiftConsole").controller("DeploymentController", [ "$scope", "$filter", "$routeParams", "AlertMessageService", "DataService", "DeploymentsService", "HPAService", "ImageStreamResolver", "ModalsService", "Navigate", "Logger", "ProjectsService", "StorageService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n) { var o = {}; a.projectName = c.project, a.name = c.deployment, a.forms = {}, a.alerts = {}, a.imagesByDockerReference = {}, a.breadcrumbs = [ { title:"Deployments", link:"project/" + c.project + "/browse/deployments" }, { title:c.deployment } ], a.emptyMessage = "Loading...", a.healthCheckURL = j.healthCheckURL(c.project, "Deployment", c.deployment, "extensions"), d.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), d.clearAlerts(); var p = function(c) { a.updatedDeployment = angular.copy(c), _.each(a.updatedDeployment.spec.template.spec.containers, function(a) { a.env = a.env || [], _.each(a.env, function(a) { b("altTextForValueFrom")(a); }); }); }, q = []; l.get(c.project).then(_.spread(function(d, j) { a.project = d, a.projectContext = j; var l = {}, r = function() { g.getHPAWarnings(a.deployment, a.autoscalers, l, d).then(function(b) { a.hpaWarnings = b; }); }; e.get({ group:"extensions", resource:"deployments" }, c.deployment, j).then(function(d) { a.loaded = !0, a.deployment = d, r(), a.saveEnvVars = function() { _.each(a.updatedDeployment.spec.template.spec.containers, function(a) { a.env = n.compactEntries(angular.copy(a.env)); }), e.update({ group:"extensions", resource:"deployments" }, c.deployment, a.updatedDeployment, j).then(function() { a.alerts.saveDCEnvVarsSuccess = { type:"success", message:c.deployment + " was updated." }, a.forms.deploymentEnvVars.$setPristine(); }, function(d) { a.alerts.saveDCEnvVarsError = { type:"error", message:c.deployment + " was not updated.", details:"Reason: " + b("getErrorDetails")(d) }; }); }, a.clearEnvVarUpdates = function() { p(a.deployment), a.forms.deploymentEnvVars.$setPristine(); }, q.push(e.watchObject({ group:"extensions", resource:"deployments" }, c.deployment, j, function(b, c) { "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This deployment has been deleted." }), a.deployment = b, a.updatingPausedState = !1, a.forms.deploymentEnvVars.$pristine ? p(b) :a.alerts.background_update = { type:"warning", message:"This deployment has been updated in the background. Saving your changes may create a conflict or cause loss of data.", links:[ { label:"Reload Environment Variables", onClick:function() { return a.clearEnvVarUpdates(), !0; } } ] }, r(), h.fetchReferencedImageStreamImages([ b.spec.template ], a.imagesByDockerReference, o, j); })), q.push(e.watch({ group:"extensions", resource:"replicasets" }, j, function(b) { var c = b.by("metadata.name"), e = new LabelSelector(d.spec.selector); c = _.filter(c, function(a) { return e.covers(new LabelSelector(a.spec.selector)); }), a.inProgressDeployment = _.chain(c).filter("status.replicas").size() > 1, a.replicaSetsForDeployment = f.sortByRevision(c); })); }, function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:404 === c.status ? "This deployment can not be found, it may have been deleted." :"The deployment details could not be loaded.", details:404 === c.status ? "Any remaining deployment history for this deployment will be shown." :"Reason: " + b("getErrorDetails")(c) }; }), e.list("limitranges", j, function(a) { l = a.by("metadata.name"), r(); }), q.push(e.watch("imagestreams", j, function(b) { var c = b.by("metadata.name"); h.buildDockerRefMapForImageStreams(c, o), a.deployment && h.fetchReferencedImageStreamImages([ a.deployment.spec.template ], a.imagesByDockerReference, o, j), k.log("imagestreams (subscribe)", a.imageStreams); })), q.push(e.watch({ group:"extensions", resource:"horizontalpodautoscalers" }, j, function(b) { a.autoscalers = g.filterHPA(b.by("metadata.name"), "Deployment", c.deployment), r(); })), q.push(e.watch("builds", j, function(b) { a.builds = b.by("metadata.name"), k.log("builds (subscribe)", a.builds); })), a.scale = function(c) { var d = function(c) { a.alerts = a.alerts || {}, a.alerts.scale = { type:"error", message:"An error occurred scaling the deployment.", details:b("getErrorDetails")(c) }; }; f.scale(a.deployment, c).then(_.noop, d); }, a.setPaused = function(c) { a.updatingPausedState = !0, f.setPaused(a.deployment, c, j).then(_.noop, function(d) { a.updatingPausedState = !1, a.alerts = a.alerts || {}, a.alerts.scale = { type:"error", message:"An error occurred " + (c ? "pausing" :"resuming") + " the deployment.", details:b("getErrorDetails")(d) }; }); }, a.removeVolume = function(c) { var d; d = _.get(a, "deployment.spec.paused") ? "This will remove the volume from the deployment." :"This will remove the volume from the deployment and start a new rollout.", c.persistentVolumeClaim ? d += " It will not delete the persistent volume claim." :c.secret ? d += " It will not delete the secret." :c.configMap && (d += " It will not delete the config map."); var e = i.confirm({ message:"Remove volume " + c.name + "?", details:d, okButtonText:"Remove", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }), f = function(c) { a.alerts["remove-volume-error"] = { type:"error", message:"An error occurred removing the volume.", details:b("getErrorDetails")(c) }; }, g = function() { m.removeVolume(a.deployment, c, j).then(_.noop, f); }; e.then(g); }, a.$on("$destroy", function() { e.unwatchAll(q); }); })); } ]), angular.module("openshiftConsole").controller("DeploymentConfigController", [ "$scope", "$filter", "$routeParams", "AlertMessageService", "BreadcrumbsService", "DataService", "DeploymentsService", "HPAService", "ImageStreamResolver", "ModalsService", "Navigate", "Logger", "ProjectsService", "StorageService", "LabelFilter", "labelNameFilter", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) { var r = {}; a.projectName = c.project, a.deploymentConfigName = c.deploymentconfig, a.deploymentConfig = null, a.deployments = {}, a.unfilteredDeployments = {}, a.imagesByDockerReference = {}, a.builds = {}, a.labelSuggestions = {}, a.forms = {}, a.alerts = {}, a.breadcrumbs = e.getBreadcrumbs({ name:c.deploymentconfig, kind:"DeploymentConfig", namespace:c.project }), a.emptyMessage = "Loading...", a.healthCheckURL = k.healthCheckURL(c.project, "DeploymentConfig", c.deploymentconfig), d.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), d.clearAlerts(); var s = b("orderObjectsByDate"), t = b("mostRecent"), u = function(c) { a.updatedDeploymentConfig = angular.copy(c), _.each(a.updatedDeploymentConfig.spec.template.spec.containers, function(a) { a.env = a.env || [], _.each(a.env, function(a) { b("altTextForValueFrom")(a); }); }); }, v = []; m.get(c.project).then(_.spread(function(d, e) { function k() { o.getLabelSelector().isEmpty() || !$.isEmptyObject(a.deployments) || $.isEmptyObject(a.unfilteredDeployments) ? delete a.alerts.deployments :a.alerts.deployments = { type:"warning", details:"The active filters are hiding all deployments." }; } a.project = d, a.projectContext = e; var m = {}, w = function() { h.getHPAWarnings(a.deploymentConfig, a.autoscalers, m, d).then(function(b) { a.hpaWarnings = b; }); }; f.get("deploymentconfigs", c.deploymentconfig, e).then(function(d) { a.loaded = !0, a.deploymentConfig = d, a.strategyParams = b("deploymentStrategyParams")(d), w(), u(d), a.saveEnvVars = function() { _.each(a.updatedDeploymentConfig.spec.template.spec.containers, function(a) { a.env = q.compactEntries(angular.copy(a.env)); }), f.update("deploymentconfigs", c.deploymentconfig, angular.copy(a.updatedDeploymentConfig), e).then(function() { a.alerts.saveDCEnvVarsSuccess = { type:"success", message:a.deploymentConfigName + " was updated." }, a.forms.dcEnvVars.$setPristine(); }, function(c) { a.alerts.saveDCEnvVarsError = { type:"error", message:a.deploymentConfigName + " was not updated.", details:"Reason: " + b("getErrorDetails")(c) }; }); }, a.clearEnvVarUpdates = function() { u(a.deploymentConfig), a.forms.dcEnvVars.$setPristine(); }, v.push(f.watchObject("deploymentconfigs", c.deploymentconfig, e, function(b, c) { "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This deployment configuration has been deleted." }), a.deploymentConfig = b, a.updatingPausedState = !1, !a.forms.dcEnvVars || a.forms.dcEnvVars.$pristine ? u(b) :a.alerts.background_update = { type:"warning", message:"This deployment configuration has been updated in the background. Saving your changes may create a conflict or cause loss of data.", links:[ { label:"Reload Environment Variables", onClick:function() { return a.clearEnvVarUpdates(), !0; } } ] }, w(), i.fetchReferencedImageStreamImages([ b.spec.template ], a.imagesByDockerReference, r, e); })); }, function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:404 === c.status ? "This deployment configuration can not be found, it may have been deleted." :"The deployment configuration details could not be loaded.", details:404 === c.status ? "Any remaining deployment history for this deployment will be shown." :"Reason: " + b("getErrorDetails")(c) }; }), v.push(f.watch("replicationcontrollers", e, function(d, e, f) { var h = c.deploymentconfig; if (a.emptyMessage = "No deployments to show", e) { if (g.deploymentBelongsToConfig(f, c.deploymentconfig)) { var i = f.metadata.name; switch (e) { case "ADDED": case "MODIFIED": a.unfilteredDeployments[i] = f, b("deploymentIsInProgress")(f) ? (a.deploymentConfigDeploymentsInProgress[h] = a.deploymentConfigDeploymentsInProgress[h] || {}, a.deploymentConfigDeploymentsInProgress[h][i] = f) :a.deploymentConfigDeploymentsInProgress[h] && delete a.deploymentConfigDeploymentsInProgress[h][i], f.causes = b("deploymentCauses")(f); break; case "DELETED": delete a.unfilteredDeployments[i], a.deploymentConfigDeploymentsInProgress[h] && delete a.deploymentConfigDeploymentsInProgress[h][i]; } } } else { var j = g.associateDeploymentsToDeploymentConfig(d.by("metadata.name")); a.unfilteredDeployments = j[c.deploymentconfig] || {}, angular.forEach(a.unfilteredDeployments, function(a) { a.causes = b("deploymentCauses")(a); }), a.deploymentConfigDeploymentsInProgress = g.associateRunningDeploymentToDeploymentConfig(j); } a.deployments = o.getLabelSelector().select(a.unfilteredDeployments), a.orderedDeployments = s(a.deployments, !0), a.deploymentInProgress = !!_.size(a.deploymentConfigDeploymentsInProgress[h]), a.mostRecent = t(a.unfilteredDeployments), k(), o.addLabelSuggestionsFromResources(a.unfilteredDeployments, a.labelSuggestions), o.setLabelSuggestions(a.labelSuggestions); }, { http:{ params:{ labelSelector:p("deploymentConfig") + "=" + a.deploymentConfigName } } })), f.list("limitranges", e, function(a) { m = a.by("metadata.name"), w(); }), v.push(f.watch("imagestreams", e, function(b) { var c = b.by("metadata.name"); i.buildDockerRefMapForImageStreams(c, r), a.deploymentConfig && i.fetchReferencedImageStreamImages([ a.deploymentConfig.spec.template ], a.imagesByDockerReference, r, e), l.log("imagestreams (subscribe)", a.imageStreams); })), v.push(f.watch("builds", e, function(b) { a.builds = b.by("metadata.name"), l.log("builds (subscribe)", a.builds); })), v.push(f.watch({ group:"extensions", resource:"horizontalpodautoscalers" }, e, function(b) { a.autoscalers = h.filterHPA(b.by("metadata.name"), "DeploymentConfig", c.deploymentconfig), w(); })), o.onActiveFiltersChanged(function(b) { a.$apply(function() { a.deployments = b.select(a.unfilteredDeployments), a.orderedDeployments = s(a.deployments, !0), k(); }); }), a.canDeploy = function() { return !!a.deploymentConfig && (!a.deploymentConfig.metadata.deletionTimestamp && (!a.deploymentInProgress && !a.deploymentConfig.spec.paused)); }, a.startLatestDeployment = function() { a.canDeploy() && g.startLatestDeployment(a.deploymentConfig, e, a); }, a.scale = function(c) { var d = function(c) { a.alerts["scale-error"] = { type:"error", message:"An error occurred scaling the deployment config.", details:b("getErrorDetails")(c) }; }; g.scale(a.deploymentConfig, c).then(_.noop, d); }, a.setPaused = function(c) { a.updatingPausedState = !0, g.setPaused(a.deploymentConfig, c, e).then(_.noop, function(d) { a.updatingPausedState = !1, a.alerts["pause-error"] = { type:"error", message:"An error occurred " + (c ? "pausing" :"resuming") + " the deployment config.", details:b("getErrorDetails")(d) }; }); }; var x = function() { if (_.get(a, "deploymentConfig.spec.paused")) return !1; var b = _.get(a, "deploymentConfig.spec.triggers", []); return _.some(b, { type:"ConfigChange" }); }; a.removeVolume = function(c) { var d; d = x() ? "This will remove the volume from the deployment config and trigger a new deployment." :"This will remove the volume from the deployment config.", c.persistentVolumeClaim ? d += " It will not delete the persistent volume claim." :c.secret ? d += " It will not delete the secret." :c.configMap && (d += " It will not delete the config map."); var f = j.confirm({ message:"Remove volume " + c.name + "?", details:d, okButtonText:"Remove", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }), g = function(c) { a.alerts["remove-volume-error"] = { type:"error", message:"An error occurred removing the volume.", details:b("getErrorDetails")(c) }; }, h = function() { n.removeVolume(a.deploymentConfig, c, e).then(_.noop, g); }; f.then(h); }, a.$on("$destroy", function() { f.unwatchAll(v); }); })); } ]), angular.module("openshiftConsole").controller("ReplicaSetController", [ "$scope", "$filter", "$routeParams", "AlertMessageService", "AuthorizationService", "BreadcrumbsService", "DataService", "DeploymentsService", "HPAService", "ImageStreamResolver", "Logger", "MetricsService", "ModalsService", "Navigate", "ProjectsService", "StorageService", "keyValueEditorUtils", "kind", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) { var s = !1, t = b("annotation"), u = b("humanizeKind")(r); switch (r) { case "ReplicaSet": a.resource = { group:"extensions", resource:"replicasets" }, a.healthCheckURL = n.healthCheckURL(c.project, "ReplicaSet", c.replicaSet, "extensions"); break; case "ReplicationController": a.resource = "replicationcontrollers", a.healthCheckURL = n.healthCheckURL(c.project, "ReplicationController", c.replicaSet); } var v = {}; a.projectName = c.project, a.kind = r, a.replicaSet = null, a.deploymentConfig = null, a.deploymentConfigMissing = !1, a.imagesByDockerReference = {}, a.builds = {}, a.alerts = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.forms = {}, a.logOptions = {}, d.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), d.clearAlerts(); var w = []; l.isAvailable().then(function(b) { a.metricsAvailable = b; }); var x = b("deploymentStatus"), y = function(b) { a.logCanRun = !_.includes([ "New", "Pending" ], x(b)); }, z = b("altTextForValueFrom"), A = function(b) { a.updatedDeployment = angular.copy(b), _.each(a.updatedDeployment.spec.template.spec.containers, function(a) { a.env = a.env || [], _.each(a.env, z); }); }; a.saveEnvVars = function() { _.each(a.updatedDeployment.spec.template.spec.containers, function(a) { a.env = q.compactEntries(angular.copy(a.env)); }), g.update(a.resource, c.replicaSet, angular.copy(a.updatedDeployment), a.projectContext).then(function() { a.alerts.saveEnvSuccess = { type:"success", message:a.replicaSet.metadata.name + " was updated." }, a.forms.envForm.$setPristine(); }, function(c) { a.alerts.saveEnvError = { type:"error", message:a.replicaSet.metadata.name + " was not updated.", details:"Reason: " + b("getErrorDetails")(c) }; }); }, a.clearEnvVarUpdates = function() { A(a.replicaSet), a.forms.envForm.$setPristine(); }; var B = b("isIE")() || b("isEdge")(); o.get(c.project).then(_.spread(function(d, l) { a.project = d, a.projectContext = l; var o, q, z = {}, C = {}, D = function() { if (a.hpaForRS = i.filterHPA(z, r, c.replicaSet), a.deploymentConfigName && a.isActive) { var b = i.filterHPA(z, "DeploymentConfig", a.deploymentConfigName); a.autoscalers = a.hpaForRS.concat(b); } else if (a.deployment && a.isActive) { var d = i.filterHPA(z, "Deployment", a.deployment.metadata.name); a.autoscalers = a.hpaForRS.concat(d); } else a.autoscalers = a.hpaForRS; }, E = function() { w.push(g.watch(a.resource, l, function(b) { var c, d = []; angular.forEach(b.by("metadata.name"), function(b) { var c = t(b, "deploymentConfig") || ""; c === a.deploymentConfigName && d.push(b); }), c = h.getActiveDeployment(d), a.isActive = c && c.metadata.uid === a.replicaSet.metadata.uid, D(); })); }, F = function() { o && q && (a.podsForDeployment = _.filter(o, function(a) { return q.matches(a); })); }, G = function() { i.getHPAWarnings(a.replicaSet, a.autoscalers, C, d).then(function(b) { a.hpaWarnings = b; }); }, H = function(d) { var e = t(d, "deploymentConfig"); if (e) { s = !0, a.deploymentConfigName = e; var f = t(d, "deploymentVersion"); f && (a.logOptions.version = f), a.healthCheckURL = n.healthCheckURL(c.project, "DeploymentConfig", e), g.get("deploymentconfigs", e, l, { errorNotification:!1 }).then(function(b) { a.deploymentConfig = b; }, function(c) { return 404 === c.status ? void (a.deploymentConfigMissing = !0) :void (a.alerts.load = { type:"error", message:"The deployment configuration details could not be loaded.", details:"Reason: " + b("getErrorDetails")(c) }); }); } }, I = function() { a.isActive = h.isActiveReplicaSet(a.replicaSet, a.deployment); }, J = b("hasDeployment"), K = !1, L = function() { J(a.replicaSet) && g.list({ group:"extensions", resource:"deployments" }, l, function(b) { var d = b.by("metadata.name"), e = new LabelSelector(a.replicaSet.spec.selector); return a.deployment = _.find(d, function(a) { var b = new LabelSelector(a.spec.selector); return b.covers(e); }), a.deployment ? (a.healthCheckURL = n.healthCheckURL(c.project, "Deployment", a.deployment.metadata.name, "extensions"), w.push(g.watchObject({ group:"extensions", resource:"deployments" }, a.deployment.metadata.name, l, function(b, d) { return "DELETED" === d ? (a.alerts["deployment-deleted"] = { type:"warning", message:"The deployment controlling this replica set has been deleted." }, a.healthCheckURL = n.healthCheckURL(c.project, "ReplicaSet", c.replicaSet, "extensions"), a.deploymentMissing = !0, void delete a.deployment) :(a.breadcrumbs = f.getBreadcrumbs({ object:a.replicaSet, displayName:"#" + h.getRevision(a.replicaSet), parent:{ title:a.deployment.metadata.name, link:n.resourceURL(a.deployment) }, humanizedKind:"Deployments" }), I(), void D()); })), void w.push(g.watch({ group:"extensions", resource:"replicasets" }, l, function(b) { var c = new LabelSelector(a.deployment.spec.selector); K = !1; var d = 0; _.each(b.by("metadata.name"), function(a) { if (a.status.replicas && c.covers(new LabelSelector(a.spec.selector))) return d++, d > 1 ? (K = !0, !1) :void 0; }); }))) :void (a.deploymentMissing = !0); }); }, M = function() { if (!_.isEmpty(v)) { var b = _.get(a, "replicaSet.spec.template"); b && j.fetchReferencedImageStreamImages([ b ], a.imagesByDockerReference, v, l); } }; g.get(a.resource, c.replicaSet, l).then(function(b) { switch (a.loaded = !0, a.replicaSet = b, y(b), r) { case "ReplicationController": H(b); break; case "ReplicaSet": L(); } G(), a.breadcrumbs = f.getBreadcrumbs({ object:b }), w.push(g.watchObject(a.resource, c.replicaSet, l, function(b, c) { "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This " + u + " has been deleted." }), a.replicaSet = b, !a.forms.envForm || a.forms.envForm.$pristine ? A(b) :a.alerts.background_update = { type:"warning", message:"This " + u + " has been updated in the background. Saving your changes may create a conflict or cause loss of data.", links:[ { label:"Reload Environment Variables", onClick:function() { return a.clearEnvVarUpdates(), !0; } } ] }, y(b), G(), M(); })), a.deploymentConfigName && E(), a.$watch("replicaSet.spec.selector", function() { q = new LabelSelector(a.replicaSet.spec.selector), F(); }, !0), w.push(g.watch("pods", l, function(a) { o = a.by("metadata.name"), F(); })); }, function(d) { a.loaded = !0, a.alerts.load = { type:"error", message:"The " + u + " details could not be loaded.", details:"Reason: " + b("getErrorDetails")(d) }, a.breadcrumbs = f.getBreadcrumbs({ name:c.replicaSet, kind:r, namespace:c.project }); }), w.push(g.watch(a.resource, l, function(c, d, e) { a.replicaSets = c.by("metadata.name"), a.emptyMessage = "No deployments to show", "ReplicationController" === r && (a.deploymentsByDeploymentConfig = h.associateDeploymentsToDeploymentConfig(a.replicaSets)); var f, g; e && (f = t(e, "deploymentConfig"), g = e.metadata.name), d ? "ADDED" === d || "MODIFIED" === d && b("deploymentIsInProgress")(e) ? (a.deploymentConfigDeploymentsInProgress[f] = a.deploymentConfigDeploymentsInProgress[f] || {}, a.deploymentConfigDeploymentsInProgress[f][g] = e) :"MODIFIED" === d && delete a.deploymentConfigDeploymentsInProgress[f][g] :a.deploymentConfigDeploymentsInProgress = h.associateRunningDeploymentToDeploymentConfig(a.deploymentsByDeploymentConfig), e ? "DELETED" !== d && (e.causes = b("deploymentCauses")(e)) :angular.forEach(a.replicaSets, function(a) { a.causes = b("deploymentCauses")(a); }); })), w.push(g.watch("imagestreams", l, function(a) { var b = a.by("metadata.name"); j.buildDockerRefMapForImageStreams(b, v), M(), k.log("imagestreams (subscribe)", b); })), w.push(g.watch("builds", l, function(b) { a.builds = b.by("metadata.name"), k.log("builds (subscribe)", a.builds); })), w.push(g.watch({ group:"extensions", resource:"horizontalpodautoscalers" }, l, function(a) { z = a.by("metadata.name"), D(), G(); }, { poll:B, pollInterval:6e4 })), g.list("limitranges", l, function(a) { C = a.by("metadata.name"), G(); }); var N = b("deploymentIsLatest"); a.showRollbackAction = function() { return "Complete" === x(a.replicaSet) && !N(a.replicaSet, a.deploymentConfig) && !a.replicaSet.metadata.deletionTimestamp && e.canI("deploymentconfigrollbacks", "create"); }, a.retryFailedDeployment = function(b) { h.retryFailedDeployment(b, l, a); }, a.rollbackToDeployment = function(b, c, d, e) { h.rollbackToDeployment(b, c, d, e, l, a); }, a.cancelRunningDeployment = function(b) { h.cancelRunningDeployment(b, l, a); }, a.scale = function(c) { var d = function(c) { a.alerts = a.alerts || {}, a.alerts.scale = { type:"error", message:"An error occurred scaling.", details:b("getErrorDetails")(c) }; }, e = a.deployment || a.deploymentConfig || a.replicaSet; h.scale(e, c).then(_.noop, d); }; var O = b("hasDeploymentConfig"); a.isScalable = function() { return !!_.isEmpty(a.autoscalers) && (!O(a.replicaSet) && !J(a.replicaSet) || (!(!a.deploymentConfigMissing && !a.deploymentMissing) || !(!a.deploymentConfig && !a.deployment) && (a.isActive && !K))); }, a.removeVolume = function(c) { var d = "This will remove the volume from the " + b("humanizeKind")(a.replicaSet.kind) + "."; c.persistentVolumeClaim ? d += " It will not delete the persistent volume claim." :c.secret ? d += " It will not delete the secret." :c.configMap && (d += " It will not delete the config map."); var e = m.confirm({ message:"Remove volume " + c.name + "?", details:d, okButtonText:"Remove", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }), f = function(c) { a.alerts["remove-volume-error"] = { type:"error", message:"An error occurred removing the volume.", details:b("getErrorDetails")(c) }; }, g = function() { p.removeVolume(a.replicaSet, c, l).then(_.noop, f); }; e.then(g); }, a.$on("$destroy", function() { g.unwatchAll(w); }); })); } ]), angular.module("openshiftConsole").controller("ServicesController", [ "$routeParams", "$scope", "AlertMessageService", "DataService", "ProjectsService", "$filter", "LabelFilter", "Logger", function(a, b, c, d, e, f, g, h) { b.projectName = a.project, b.services = {}, b.unfilteredServices = {}, b.routesByService = {}, b.routes = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", b.emptyMessageRoutes = "Loading...", c.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), c.clearAlerts(); var i = []; e.get(a.project).then(_.spread(function(a, c) { function e(a) { var b = {}; return angular.forEach(a, function(a, c) { var d = a.spec.to; "Service" === d.kind && (b[d.name] = b[d.name] || {}, b[d.name][c] = a); }), b; } function f() { g.getLabelSelector().isEmpty() || !$.isEmptyObject(b.services) || $.isEmptyObject(b.unfilteredServices) ? delete b.alerts.services :b.alerts.services = { type:"warning", details:"The active filters are hiding all services." }; } b.project = a, i.push(d.watch("services", c, function(a) { b.unfilteredServices = a.by("metadata.name"), g.addLabelSuggestionsFromResources(b.unfilteredServices, b.labelSuggestions), g.setLabelSuggestions(b.labelSuggestions), b.services = g.getLabelSelector().select(b.unfilteredServices), b.emptyMessage = "No services to show", f(), h.log("services (subscribe)", b.unfilteredServices); })), i.push(d.watch("routes", c, function(a) { b.routes = a.by("metadata.name"), b.emptyMessageRoutes = "No routes to show", b.routesByService = e(b.routes), h.log("routes (subscribe)", b.routesByService); })), g.onActiveFiltersChanged(function(a) { b.$apply(function() { b.services = a.select(b.unfilteredServices), f(); }); }), b.$on("$destroy", function() { d.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("ServiceController", [ "$scope", "$routeParams", "DataService", "ProjectsService", "$filter", function(a, b, c, d, e) { a.projectName = b.project, a.service = null, a.services = null, a.alerts = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.breadcrumbs = [ { title:"Services", link:"project/" + b.project + "/browse/services" }, { title:b.service } ], a.podFailureReasons = { Pending:"This pod will not receive traffic until all of its containers have been created." }; var f = {}, g = [], h = function() { a.service && (a.portsByRoute = {}, _.each(a.service.spec.ports, function(b) { var c = !1; b.nodePort && (a.showNodePorts = !0), _.each(a.routesForService, function(d) { d.spec.port && d.spec.port.targetPort !== b.name && d.spec.port.targetPort !== b.targetPort || (a.portsByRoute[d.metadata.name] = a.portsByRoute[d.metadata.name] || [], a.portsByRoute[d.metadata.name].push(b), c = !0); }), c || (a.portsByRoute[""] = a.portsByRoute[""] || [], a.portsByRoute[""].push(b)); })); }, i = function() { if (a.podsForService = {}, a.service) { var b = new LabelSelector(a.service.spec.selector); a.podsForService = b.select(f); } }, j = function(b, c) { a.loaded = !0, a.service = b, i(), h(), "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This service has been deleted." }); }; d.get(b.project).then(_.spread(function(d, k) { a.project = d, a.projectContext = k, c.get("services", b.service, k).then(function(a) { j(a), g.push(c.watchObject("services", b.service, k, j)); }, function(b) { a.loaded = !0, a.alerts.load = { type:"error", message:"The service details could not be loaded.", details:"Reason: " + e("getErrorDetails")(b) }; }), g.push(c.watch("services", k, function(b) { a.services = b.by("metadata.name"); })), g.push(c.watch("pods", k, function(a) { f = a.by("metadata.name"), i(); })), g.push(c.watch("endpoints", k, function(c) { a.podsWithEndpoints = {}; var d = c.by("metadata.name")[b.service]; d && _.each(d.subsets, function(b) { _.each(b.addresses, function(b) { "Pod" === _.get(b, "targetRef.kind") && (a.podsWithEndpoints[b.targetRef.name] = !0); }); }); })), g.push(c.watch("routes", k, function(c) { a.routesForService = {}, angular.forEach(c.by("metadata.name"), function(c) { "Service" === c.spec.to.kind && c.spec.to.name === b.service && (a.routesForService[c.metadata.name] = c); }), h(), Logger.log("routes (subscribe)", a.routesByService); })), a.$on("$destroy", function() { c.unwatchAll(g); }); })); } ]), angular.module("openshiftConsole").controller("SecretsController", [ "$routeParams", "$scope", "AlertMessageService", "DataService", "ProjectsService", "SecretsService", function(a, b, c, d, e, f) { b.projectName = a.project, b.secretsByType = {}, b.alerts = b.alerts || {}, c.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), c.clearAlerts(), e.get(a.project).then(_.spread(function(a, c) { b.project = a, b.context = c, d.list("secrets", c, function(a) { b.secretsByType = f.groupSecretsByType(a), b.loaded = !0; }); })); } ]), angular.module("openshiftConsole").controller("SecretController", [ "$routeParams", "$filter", "$scope", "AlertMessageService", "DataService", "ProjectsService", "SecretsService", function(a, b, c, d, e, f, g) { c.projectName = a.project, c.secretName = a.secret, c.view = { showSecret:!1 }, c.alerts = c.alerts || {}, c.emptyMessage = "Loading...", c.breadcrumbs = [ { title:"Secrets", link:"project/" + a.project + "/browse/secrets" }, { title:c.secretName } ], d.getAlerts().forEach(function(a) { c.alerts[a.name] = a.data; }), d.clearAlerts(), f.get(a.project).then(_.spread(function(a, d) { c.project = a, c.context = d, e.get("secrets", c.secretName, d).then(function(a) { c.secret = a, c.decodedSecretData = g.decodeSecretData(c.secret.data), c.loaded = !0; }, function(a) { c.loaded = !0, c.alerts.load = { type:"error", message:"The secret details could not be loaded.", details:"Reason: " + b("getErrorDetails")(a) }; }); })); } ]), angular.module("openshiftConsole").controller("CreateSecretController", [ "$filter", "$location", "$routeParams", "$scope", "$window", "AlertMessageService", "ApplicationGenerator", "AuthorizationService", "DataService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k) { d.alerts = {}, d.projectName = c.project, d.breadcrumbs = [ { title:d.projectName, link:"project/" + d.projectName }, { title:"Secrets", link:"project/" + d.projectName + "/browse/secrets" }, { title:"Create Secret" } ]; var l = function() { return c.then ? void b.url(c.then) :void j.toResourceList("secrets", d.projectName); }; k.get(c.project).then(_.spread(function(b, e) { return d.project = b, d.context = e, d.breadcrumbs[0].title = a("displayName")(b), h.canI("secrets", "create", c.project) ? (d.postCreateAction = function(a, b) { _.each(b, function(a) { f.addAlert(a); }), l(); }, void (d.cancel = l)) :void j.toErrorPage("You do not have authority to create secrets in project " + c.project + ".", "access_denied"); })); } ]), angular.module("openshiftConsole").controller("ConfigMapsController", [ "$scope", "$routeParams", "AlertMessageService", "DataService", "LabelFilter", "ProjectsService", function(a, b, c, d, e, f) { a.projectName = b.project, a.alerts = a.alerts || {}, a.loaded = !1, a.labelSuggestions = {}, c.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), c.clearAlerts(); var g, h = [], i = function() { e.getLabelSelector().isEmpty() || !_.isEmpty(a.configMaps) || _.isEmpty(g) ? delete a.alerts["config-maps"] :a.alerts["config-maps"] = { type:"warning", details:"The active filters are hiding all config maps." }; }, j = function() { e.addLabelSuggestionsFromResources(g, a.labelSuggestions), e.setLabelSuggestions(a.labelSuggestions); }, k = function() { var b = e.getLabelSelector().select(g); a.configMaps = _.sortBy(b, "metadata.name"), i(); }; f.get(b.project).then(_.spread(function(b, c) { a.project = b, h.push(d.watch("configmaps", c, function(b) { g = b.by("metadata.name"), j(), k(), a.loaded = !0; })), e.onActiveFiltersChanged(function() { a.$apply(k); }), a.$on("$destroy", function() { d.unwatchAll(h); }); })); } ]), angular.module("openshiftConsole").controller("ConfigMapController", [ "$scope", "$routeParams", "AlertMessageService", "BreadcrumbsService", "DataService", "ProjectsService", function(a, b, c, d, e, f) { a.projectName = b.project, a.alerts = a.alerts || {}, a.loaded = !1, a.labelSuggestions = {}, a.breadcrumbs = d.getBreadcrumbs({ name:b.configMap, kind:"ConfigMap", namespace:b.project }), c.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), c.clearAlerts(); var g = [], h = function(b, c) { a.loaded = !0, a.configMap = b, "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This config map has been deleted." }); }; f.get(b.project).then(_.spread(function(c, d) { e.get("configmaps", b.configMap, d, { errorNotification:!1 }).then(function(a) { h(a), g.push(e.watchObject("configmaps", b.configMap, d, h)); }, function(b) { a.loaded = !0, a.error = b; }), a.$on("$destroy", function() { e.unwatchAll(g); }); })); } ]), angular.module("openshiftConsole").controller("CreateConfigMapController", [ "$filter", "$routeParams", "$scope", "$window", "AuthorizationService", "DataService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h) { c.alerts = {}, c.projectName = b.project, c.breadcrumbs = [ { title:c.projectName, link:"project/" + c.projectName }, { title:"Config Maps", link:"project/" + c.projectName + "/browse/config-maps" }, { title:"Create Config Map" } ], h.get(b.project).then(_.spread(function(h, i) { return c.project = h, c.breadcrumbs[0].title = a("displayName")(h), e.canI("configmaps", "create", b.project) ? (c.configMap = { apiVersion:"v1", kind:"ConfigMap", metadata:{ namespace:b.project }, data:{} }, void (c.createConfigMap = function() { c.createConfigMapForm.$valid && (c.disableInputs = !0, f.create("configmaps", null, c.configMap, i).then(function() { d.history.back(); }, function(b) { c.disableInputs = !1, c.alerts["create-config-map"] = { type:"error", message:"An error occurred creating the config map.", details:a("getErrorDetails")(b) }; })); })) :void g.toErrorPage("You do not have authority to create config maps in project " + b.project + ".", "access_denied"); })); } ]), angular.module("openshiftConsole").controller("RoutesController", [ "$routeParams", "$scope", "AlertMessageService", "DataService", "$filter", "LabelFilter", "ProjectsService", function(a, b, c, d, e, f, g) { b.projectName = a.project, b.unfilteredRoutes = {}, b.routes = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", c.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), c.clearAlerts(); var h = []; g.get(a.project).then(_.spread(function(a, c) { function e() { f.getLabelSelector().isEmpty() || !$.isEmptyObject(b.routes) || $.isEmptyObject(b.unfilteredRoutes) ? delete b.alerts.routes :b.alerts.routes = { type:"warning", details:"The active filters are hiding all routes." }; } b.project = a, h.push(d.watch("routes", c, function(a) { b.unfilteredRoutes = a.by("metadata.name"), f.addLabelSuggestionsFromResources(b.unfilteredRoutes, b.labelSuggestions), f.setLabelSuggestions(b.labelSuggestions), b.routes = f.getLabelSelector().select(b.unfilteredRoutes), b.emptyMessage = "No routes to show", e(); })), h.push(d.watch("services", c, function(a) { b.services = a.by("metadata.name"); })), f.onActiveFiltersChanged(function(a) { b.$apply(function() { b.routes = a.select(b.unfilteredRoutes), e(); }); }), b.$on("$destroy", function() { d.unwatchAll(h); }); })); } ]), angular.module("openshiftConsole").controller("RouteController", [ "$scope", "$routeParams", "AlertMessageService", "DataService", "ProjectsService", "$filter", function(a, b, c, d, e, f) { a.projectName = b.project, a.route = null, a.alerts = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.breadcrumbs = [ { title:"Routes", link:"project/" + b.project + "/browse/routes" }, { title:b.route } ], c.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), c.clearAlerts(); var g = [], h = function(b, c) { a.loaded = !0, a.route = b, "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This route has been deleted." }); }; e.get(b.project).then(_.spread(function(c, e) { a.project = c, d.get("routes", b.route, e).then(function(a) { h(a), g.push(d.watchObject("routes", b.route, e, h)); }, function(b) { a.loaded = !0, a.alerts.load = { type:"error", message:"The route details could not be loaded.", details:"Reason: " + f("getErrorDetails")(b) }; }), g.push(d.watch("services", e, function(b) { a.services = b.by("metadata.name"); })), a.$on("$destroy", function() { d.unwatchAll(g); }); })); } ]), angular.module("openshiftConsole").controller("StorageController", [ "$routeParams", "$scope", "AlertMessageService", "DataService", "ProjectsService", "$filter", "LabelFilter", "Logger", function(a, b, c, d, e, f, g, h) { b.projectName = a.project, b.pvcs = {}, b.unfilteredPVCs = {}, b.labelSuggestions = {}, b.alerts = b.alerts || {}, b.emptyMessage = "Loading...", c.getAlerts().forEach(function(a) { b.alerts[a.name] = a.data; }), c.clearAlerts(); var i = []; e.get(a.project).then(_.spread(function(a, c) { function e() { g.getLabelSelector().isEmpty() || !$.isEmptyObject(b.pvcs) || $.isEmptyObject(b.unfilteredPVCs) ? delete b.alerts.storage :b.alerts.storage = { type:"warning", details:"The active filters are hiding all persistent volume claims." }; } b.project = a, i.push(d.watch("persistentvolumeclaims", c, function(a) { b.unfilteredPVCs = a.by("metadata.name"), g.addLabelSuggestionsFromResources(b.unfilteredPVCs, b.labelSuggestions), g.setLabelSuggestions(b.labelSuggestions), b.pvcs = g.getLabelSelector().select(b.unfilteredPVCs), b.emptyMessage = "No persistent volume claims to show", e(), h.log("pvcs (subscribe)", b.unfilteredPVCs); })), g.onActiveFiltersChanged(function(a) { b.$apply(function() { b.pvcs = a.select(b.unfilteredPVCs), e(); }); }), b.$on("$destroy", function() { d.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("OtherResourcesController", [ "$routeParams", "$location", "$scope", "AlertMessageService", "AuthorizationService", "DataService", "ProjectsService", "$filter", "LabelFilter", "Logger", "APIService", function(a, b, c, d, e, f, g, h, i, j, k) { function l() { i.getLabelSelector().isEmpty() || !$.isEmptyObject(c.resources) || $.isEmptyObject(c.unfilteredResources) ? delete c.alerts.resources :c.alerts.resources = { type:"warning", details:"The active filters are hiding all " + k.kindToResource(c.kindSelector.selected.kind, !0) + "." }; } function m() { var a = c.kindSelector.selected; if (a) { var d = b.search(); d.kind = a.kind, d.group = a.group || "", b.replace().search(d), c.selectedResource = { resource:k.kindToResource(a.kind), group:a.group || "" }, f.list({ group:a.group, resource:k.kindToResource(a.kind) }, c.context, function(b) { c.unfilteredResources = b.by("metadata.name"), c.labelSuggestions = {}, i.addLabelSuggestionsFromResources(c.unfilteredResources, c.labelSuggestions), i.setLabelSuggestions(c.labelSuggestions), c.resources = i.getLabelSelector().select(c.unfilteredResources), c.emptyMessage = "No " + k.kindToResource(a.kind, !0) + " to show", l(); }); } } c.projectName = a.project, c.labelSuggestions = {}, c.alerts = c.alerts || {}, c.emptyMessage = "Select a resource from the list above ...", c.kindSelector = { disabled:!0 }, c.kinds = _.filter(k.availableKinds(), function(a) { switch (a.kind) { case "ReplicationController": case "Deployment": case "DeploymentConfig": case "BuildConfig": case "Build": case "ConfigMap": case "Pod": case "PersistentVolumeClaim": case "Event": case "Secret": case "Service": case "Route": case "ImageStream": case "ImageStreamTag": case "ImageStreamImage": case "ImageStreamImport": case "ImageStreamMapping": case "LimitRange": case "ReplicaSet": case "ResourceQuota": case "AppliedClusterResourceQuota": return !1; default: return !0; } }), c.getReturnURL = function() { var b = _.get(c, "kindSelector.selected.kind"); return b ? URI.expand("project/{projectName}/browse/other?kind={kind}&group={group}", { projectName:a.project, kind:b, group:_.get(c, "kindSelector.selected.group", "") }).toString() :""; }, d.getAlerts().forEach(function(a) { c.alerts[a.name] = a.data; }), d.clearAlerts(); var n = function(a, b) { return _.some(c.kinds, function(c) { return c.kind === a && (!c.group && !b || c.group === b); }); }; g.get(a.project).then(_.spread(function(b, d) { c.kinds = _.filter(c.kinds, function(a) { var b = { resource:k.kindToResource(a.kind), group:a.group || "" }; return !!e.checkResource(b.resource) && e.canI(b, "list", c.projectName); }), c.project = b, c.context = d, c.kindSelector.disabled = !1, a.kind && n(a.kind, a.group) && (_.set(c, "kindSelector.selected.kind", a.kind), _.set(c, "kindSelector.selected.group", a.group || "")); })), c.loadKind = m, c.$watch("kindSelector.selected", function() { c.alerts = {}, m(); }); var o = h("humanizeKind"); c.matchKind = function(a, b) { return o(a).toLowerCase().indexOf(b.toLowerCase()) !== -1; }, i.onActiveFiltersChanged(function(a) { c.$apply(function() { c.resources = a.select(c.unfilteredResources), l(); }); }); } ]), angular.module("openshiftConsole").controller("PersistentVolumeClaimController", [ "$scope", "$routeParams", "DataService", "ProjectsService", "$filter", function(a, b, c, d, e) { a.projectName = b.project, a.pvc = null, a.alerts = {}, a.renderOptions = a.renderOptions || {}, a.renderOptions.hideFilterWidget = !0, a.breadcrumbs = [ { title:"Persistent Volume Claims", link:"project/" + b.project + "/browse/storage" }, { title:b.pvc } ]; var f = [], g = function(b, c) { a.pvc = b, a.loaded = !0, "DELETED" === c && (a.alerts.deleted = { type:"warning", message:"This persistent volume claim has been deleted." }); }; d.get(b.project).then(_.spread(function(d, h) { a.project = d, c.get("persistentvolumeclaims", b.pvc, h).then(function(a) { g(a), f.push(c.watchObject("persistentvolumeclaims", b.pvc, h, g)); }, function(b) { a.loaded = !0, a.alerts.load = { type:"error", message:"The persistent volume claim details could not be loaded.", details:"Reason: " + e("getErrorDetails")(b) }; }), a.$on("$destroy", function() { c.unwatchAll(f); }); })); } ]), angular.module("openshiftConsole").controller("SetLimitsController", [ "$filter", "$location", "$parse", "$routeParams", "$scope", "AlertMessageService", "APIService", "AuthorizationService", "BreadcrumbsService", "DataService", "LimitRangesService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { if (!d.kind || !d.name) return void l.toErrorPage("Kind or name parameter missing."); var n = [ "Deployment", "DeploymentConfig", "ReplicaSet", "ReplicationController" ]; if (!_.includes(n, d.kind)) return void l.toErrorPage("Health checks are not supported for kind " + d.kind + "."); var o = a("humanizeKind"), p = o(d.kind, !0) + " " + d.name; e.name = d.name, "ReplicationController" !== d.kind && "ReplicaSet" !== d.kind || (e.showPodWarning = !0), e.alerts = {}, e.renderOptions = { hideFilterWidget:!0 }, e.breadcrumbs = i.getBreadcrumbs({ name:d.name, kind:d.kind, namespace:d.project, subpage:"Edit Resource Limits", includeProject:!0 }); var q = a("getErrorDetails"), r = function(a, b) { e.alerts["set-compute-limits"] = { type:"error", message:a, details:b }; }; m.get(d.project).then(_.spread(function(c, m) { e.breadcrumbs[0].title = a("displayName")(c); var n = { resource:g.kindToResource(d.kind), group:d.group }; if (!h.canI(n, "update", d.project)) return void l.toErrorPage("You do not have authority to update " + o(d.kind) + " " + d.name + ".", "access_denied"); j.get(n, e.name, m).then(function(a) { var d = angular.copy(a); e.breadcrumbs = i.getBreadcrumbs({ object:d, project:c, subpage:"Edit Resource Limits", includeProject:!0 }), e.resourceURL = l.resourceURL(d), e.containers = _.get(d, "spec.template.spec.containers"), e.save = function() { e.disableInputs = !0, j.update(n, e.name, d, m).then(function() { f.addAlert({ name:e.name, data:{ type:"success", message:p + " was updated." } }), b.url(e.resourceURL); }, function(a) { e.disableInputs = !1, r(p + " could not be updated.", q(a)); }); }; }, function(a) { r(p + " could not be loaded.", q(a)); }); var s = function() { e.hideCPU || (e.cpuProblems = k.validatePodLimits(e.limitRanges, "cpu", e.containers, c)), e.memoryProblems = k.validatePodLimits(e.limitRanges, "memory", e.containers, c); }; j.list("limitranges", m, function(b) { e.limitRanges = b.by("metadata.name"), 0 !== a("hashSize")(b) && e.$watch("containers", s, !0); }); })); } ]), angular.module("openshiftConsole").controller("EditBuildConfigController", [ "$scope", "$filter", "$location", "$routeParams", "AlertMessageService", "ApplicationGenerator", "AuthorizationService", "DataService", "Navigate", "ProjectsService", "SOURCE_URL_PATTERN", "SecretsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { a.projectName = d.project, a.buildConfig = null, a.alerts = {}, a.sourceURLPattern = k, a.options = {}, a.jenkinsfileOptions = { type:"path" }, a.selectTypes = { ImageStreamTag:"Image Stream Tag", ImageStreamImage:"Image Stream Image", DockerImage:"Docker Image Repository" }, a.buildFromTypes = [ "ImageStreamTag", "ImageStreamImage", "DockerImage" ], a.pushToTypes = [ "ImageStreamTag", "DockerImage", "None" ], a.jenkinsfileTypes = [ { id:"path", title:"From Source Repository" }, { id:"inline", title:"Inline" } ], a.view = { advancedOptions:!1 }, a.breadcrumbs = [ { title:d.project, link:"project/" + d.project } ], d.isPipeline ? (a.breadcrumbs.push({ title:"Pipelines", link:"project/" + d.project + "/browse/pipelines" }), a.breadcrumbs.push({ title:d.buildconfig, link:"project/" + d.project + "/browse/pipelines/" + d.buildconfig })) :(a.breadcrumbs.push({ title:"Builds", link:"project/" + d.project + "/browse/builds" }), a.breadcrumbs.push({ title:d.buildconfig, link:"project/" + d.project + "/browse/builds/" + d.buildconfig })), a.breadcrumbs.push({ title:d.isPipeline ? "Edit Pipelines" :"Edit Builds" }), a.imageOptions = { from:{}, to:{}, fromSource:{} }, a.sources = { binary:!1, dockerfile:!1, git:!1, images:!1, contextDir:!1, none:!0 }, a.triggers = { githubWebhooks:[], genericWebhooks:[], imageChangeTriggers:[], builderImageChangeTrigger:{}, configChangeTrigger:{} }, a.runPolicyTypes = [ "Serial", "Parallel", "SerialLatestOnly" ], e.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), e.clearAlerts(), a.secrets = {}; var n = [], o = b("buildStrategy"); j.get(d.project).then(_.spread(function(c, e) { return a.project = c, a.context = e, a.breadcrumbs[0].title = b("displayName")(c), g.canI("buildconfigs", "update", d.project) ? void h.get("buildconfigs", d.buildconfig, e).then(function(c) { a.buildConfig = c, a.updatedBuildConfig = angular.copy(a.buildConfig), a.buildStrategy = o(a.updatedBuildConfig), a.strategyType = a.buildConfig.spec.strategy.type, a.envVars = a.buildStrategy.env || [], _.each(a.envVars, function(a) { b("altTextForValueFrom")(a); }), a.triggers = p(a.triggers, a.buildConfig.spec.triggers), a.sources = w(a.sources, a.buildConfig.spec.source), _.has(c, "spec.strategy.jenkinsPipelineStrategy.jenkinsfile") && (a.jenkinsfileOptions.type = "inline"), h.list("secrets", e, function(b) { var c = l.groupSecretsByType(b), d = _.mapValues(c, function(a) { return _.map(a, "metadata.name"); }); a.secrets.secretsByType = _.each(d, function(a) { a.unshift(""); }), t(); }); var f = function(a, b) { a.type = b && b.kind ? b.kind :"None"; var d = {}, e = "", f = ""; d = "ImageStreamTag" === a.type ? { namespace:b.namespace || c.metadata.namespace, imageStream:b.name.split(":")[0], tagObject:{ tag:b.name.split(":")[1] } } :{ namespace:"", imageStream:"", tagObject:{ tag:"" } }, e = "ImageStreamImage" === a.type ? (b.namespace || c.metadata.namespace) + "/" + b.name :"", f = "DockerImage" === a.type ? b.name :"", a.imageStreamTag = d, a.imageStreamImage = e, a.dockerImage = f; }; f(a.imageOptions.from, a.buildStrategy.from), f(a.imageOptions.to, a.updatedBuildConfig.spec.output.to), a.sources.images && (a.sourceImages = a.buildConfig.spec.source.images, 1 === a.sourceImages.length ? (a.imageSourceTypes = angular.copy(a.buildFromTypes), f(a.imageOptions.fromSource, a.sourceImages[0].from), a.imageSourcePaths = _.map(a.sourceImages[0].paths, function(a) { return { name:a.sourcePath, value:a.destinationDir }; })) :(a.imageSourceFromObjects = [], a.sourceImages.forEach(function(b) { a.imageSourceFromObjects.push(b.from); }))), a.options.forcePull = !!a.buildStrategy.forcePull, "Docker" === a.strategyType && (a.options.noCache = !!a.buildConfig.spec.strategy.dockerStrategy.noCache, a.buildFromTypes.push("None")), n.push(h.watchObject("buildconfigs", d.buildconfig, e, function(b, c) { "MODIFIED" === c && (a.alerts["updated/deleted"] = { type:"warning", message:"This build configuration has changed since you started editing it. You'll need to copy any changes you've made and edit again." }), "DELETED" === c && (a.alerts["updated/deleted"] = { type:"warning", message:"This build configuration has been deleted." }, a.disableInputs = !0), a.buildConfig = b; })), a.loaded = !0; }, function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:"The build configuration details could not be loaded.", details:"Reason: " + b("getErrorDetails")(c) }; }) :void i.toErrorPage("You do not have authority to update build config " + d.buildconfig + ".", "access_denied"); })); var p = function(c, d) { function e(c, d) { var e = b("imageObjectRef")(c, a.projectName), f = b("imageObjectRef")(d, a.projectName); return e === f; } var f = o(a.buildConfig).from; return d.forEach(function(a) { switch (a.type) { case "Generic": c.genericWebhooks.push({ disabled:!1, data:a }); break; case "GitHub": c.githubWebhooks.push({ disabled:!1, data:a }); break; case "ImageChange": var b = a.imageChange.from; b || (b = f); var d = { present:!0, data:a }; e(b, f) ? c.builderImageChangeTrigger = d :c.imageChangeTriggers.push(d); break; case "ConfigChange": c.configChangeTrigger = { present:!0, data:a }; } }), _.isEmpty(c.builderImageChangeTrigger) && (c.builderImageChangeTrigger = { present:!1, data:{ imageChange:{}, type:"ImageChange" } }), _.isEmpty(c.configChangeTrigger) && (c.configChangeTrigger = { present:!1, data:{ type:"ConfigChange" } }), c; }; a.aceLoaded = function(a) { var b = a.getSession(); b.setOption("tabSize", 2), b.setOption("useSoftTabs", !0), a.$blockScrolling = 1 / 0; }; var q = function(a) { return _.map(m.compactEntries(a), function(a) { return { sourcePath:a.name, destinationDir:a.value }; }); }, r = function(b) { var c = {}; switch (b.type) { case "ImageStreamTag": c = { kind:b.type, name:b.imageStreamTag.imageStream + ":" + b.imageStreamTag.tagObject.tag }, b.imageStreamTag.namespace !== a.buildConfig.metadata.namespace && (c.namespace = b.imageStreamTag.namespace); break; case "DockerImage": c = { kind:b.type, name:b.dockerImage }; break; case "ImageStreamImage": var d = b.imageStreamImage.split("/"); c = { kind:b.type, name:_.last(d) }, c.namespace = 1 !== d.length ? d[0] :a.buildConfig.metadata.namespace; } return c; }, s = function() { var b = [].concat(a.triggers.githubWebhooks, a.triggers.genericWebhooks, a.triggers.imageChangeTriggers, a.triggers.builderImageChangeTrigger, a.triggers.configChangeTrigger); return b = _.filter(b, function(a) { return _.has(a, "disabled") && !a.disabled || a.present; }), b = _.map(b, "data"); }, t = function() { switch (a.secrets.picked = { gitSecret:a.buildConfig.spec.source.sourceSecret ? [ a.buildConfig.spec.source.sourceSecret ] :[ { name:"" } ], pullSecret:o(a.buildConfig).pullSecret ? [ o(a.buildConfig).pullSecret ] :[ { name:"" } ], pushSecret:a.buildConfig.spec.output.pushSecret ? [ a.buildConfig.spec.output.pushSecret ] :[ { name:"" } ] }, a.strategyType) { case "Source": case "Docker": a.secrets.picked.sourceSecrets = a.buildConfig.spec.source.secrets || [ { secret:{ name:"" }, destinationDir:"" } ]; break; case "Custom": a.secrets.picked.sourceSecrets = o(a.buildConfig).secrets || [ { secretSource:{ name:"" }, mountPath:"" } ]; } }, u = function(a, b, c) { b.name ? a[c] = b :delete a[c]; }, v = function(b, c) { var d = "Custom" === a.strategyType ? "secretSource" :"secret", e = _.filter(c, function(a) { return a[d].name; }); _.isEmpty(e) ? delete b.secrets :b.secrets = e; }, w = function(a, b) { return "None" === b.type ? a :(a.none = !1, angular.forEach(b, function(b, c) { a[c] = !0; }), a); }; a.save = function() { switch (a.disableInputs = !0, o(a.updatedBuildConfig).forcePull = a.options.forcePull, a.strategyType) { case "Docker": o(a.updatedBuildConfig).noCache = a.options.noCache; break; case "JenkinsPipeline": "path" === a.jenkinsfileOptions.type ? delete a.updatedBuildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfile :delete a.updatedBuildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath; } switch (a.sources.images && !_.isEmpty(a.sourceImages) && (a.updatedBuildConfig.spec.source.images[0].paths = q(a.imageSourcePaths), a.updatedBuildConfig.spec.source.images[0].from = r(a.imageOptions.fromSource)), "None" === a.imageOptions.from.type ? delete o(a.updatedBuildConfig).from :o(a.updatedBuildConfig).from = r(a.imageOptions.from), "None" === a.imageOptions.to.type ? delete a.updatedBuildConfig.spec.output.to :a.updatedBuildConfig.spec.output.to = r(a.imageOptions.to), o(a.updatedBuildConfig).env = m.compactEntries(a.envVars), u(a.updatedBuildConfig.spec.source, _.head(a.secrets.picked.gitSecret), "sourceSecret"), u(o(a.updatedBuildConfig), _.head(a.secrets.picked.pullSecret), "pullSecret"), u(a.updatedBuildConfig.spec.output, _.head(a.secrets.picked.pushSecret), "pushSecret"), a.strategyType) { case "Source": case "Docker": v(a.updatedBuildConfig.spec.source, a.secrets.picked.sourceSecrets); break; case "Custom": v(o(a.updatedBuildConfig), a.secrets.picked.sourceSecrets); } a.updatedBuildConfig.spec.triggers = s(), h.update("buildconfigs", a.updatedBuildConfig.metadata.name, a.updatedBuildConfig, a.context).then(function() { e.addAlert({ name:a.updatedBuildConfig.metadata.name, data:{ type:"success", message:"Build Config " + a.updatedBuildConfig.metadata.name + " was successfully updated." } }), c.path(i.resourceURL(a.updatedBuildConfig, "BuildConfig", a.updatedBuildConfig.metadata.namespace)); }, function(c) { a.disableInputs = !1, a.alerts.save = { type:"error", message:"An error occurred updating the build " + a.updatedBuildConfig.metadata.name + "Build Config", details:b("getErrorDetails")(c) }; }); }, a.$on("$destroy", function() { h.unwatchAll(n); }); } ]), angular.module("openshiftConsole").controller("EditConfigMapController", [ "$filter", "$routeParams", "$scope", "$window", "DataService", "BreadcrumbsService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h) { var i = []; c.alerts = {}, c.forms = {}, c.projectName = b.project, c.breadcrumbs = f.getBreadcrumbs({ name:b.configMap, kind:"ConfigMap", namespace:b.project, includeProject:!0, subpage:"Edit Config Map" }); var j = function(a) { return _.get(a, "metadata.resourceVersion"); }; h.get(b.project).then(_.spread(function(g, h) { e.get("configmaps", b.configMap, h).then(function(a) { c.loaded = !0, c.breadcrumbs = f.getBreadcrumbs({ name:b.configMap, object:a, includeProject:!0, project:g, subpage:"Edit Config Map" }), c.configMap = a, i.push(e.watchObject("configmaps", b.configMap, h, function(a, b) { c.resourceChanged = j(a) !== j(c.configMap), c.resourceDeleted = "DELETED" === b; })); }, function(b) { c.loaded = !0, c.alerts.load = { type:"error", message:"The config map details could not be loaded.", details:a("getErrorDetails")(b) }; }), c.updateConfigMap = function() { c.forms.editConfigMapForm.$valid && (c.disableInputs = !0, e.update("configmaps", c.configMap.metadata.name, c.configMap, h).then(function() { d.history.back(); }, function(b) { c.disableInputs = !1, c.alerts["create-config-map"] = { type:"error", message:"An error occurred updating the config map.", details:a("getErrorDetails")(b) }; })); }, c.$on("$destroy", function() { e.unwatchAll(i); }); })); } ]), angular.module("openshiftConsole").controller("EditDeploymentConfigController", [ "$scope", "$filter", "$location", "$routeParams", "$uibModal", "AlertMessageService", "AuthorizationService", "BreadcrumbsService", "DataService", "Navigate", "ProjectsService", "SecretsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { a.projectName = d.project, a.deploymentConfig = null, a.alerts = {}, a.view = { advancedStrategyOptions:!1, advancedImageOptions:!1 }, a.triggers = {}, a.breadcrumbs = h.getBreadcrumbs({ name:d.name, kind:d.kind, namespace:d.project, subpage:"Edit Deployment Config", includeProject:!0 }), a.deploymentConfigStrategyTypes = [ "Recreate", "Rolling", "Custom" ], f.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), f.clearAlerts(); var n = [], o = function(a) { switch (a) { case "Recreate": return "recreateParams"; case "Rolling": return "rollingParams"; case "Custom": return "customParams"; default: return void Logger.error("Unknown deployment strategy type: " + a); } }; k.get(d.project).then(_.spread(function(c, e) { return a.project = c, a.context = e, g.canI("deploymentconfigs", "update", d.project) ? void i.get("deploymentconfigs", d.deploymentconfig, e).then(function(f) { a.deploymentConfig = f, a.breadcrumbs = h.getBreadcrumbs({ object:f, project:c, subpage:"Edit", includeProject:!0 }); var g = function(c, d) { var e = {}, f = _.filter(d, { type:"ImageChange" }); return _.each(c, function(c) { var d = _.find(f, function(a) { return _.includes(a.imageChangeParams.containerNames, c.name); }), g = {}; if (c.env = c.env || [], _.each(c.env, function(a) { b("altTextForValueFrom")(a); }), e[c.name] = { env:c.env, image:c.image, hasDeploymentTrigger:!_.isEmpty(d) }, d) { var h = d.imageChangeParams.from, i = h.name.split(":"); g = { data:d, istag:{ namespace:h.namespace || a.projectName, imageStream:i[0], tagObject:{ tag:i[1] } }, automatic:_.get(d, "imageChangeParams.automatic", !1) }; } else g = { istag:{ namespace:"", imageStream:"" }, automatic:!0 }; _.set(e, [ c.name, "triggerData" ], g); }), e; }; a.updatedDeploymentConfig = angular.copy(a.deploymentConfig), a.containerNames = _.map(a.deploymentConfig.spec.template.spec.containers, "name"), a.containerConfigByName = g(a.updatedDeploymentConfig.spec.template.spec.containers, a.updatedDeploymentConfig.spec.triggers), a.secrets = { pullSecrets:angular.copy(a.deploymentConfig.spec.template.spec.imagePullSecrets) || [ { name:"" } ] }, a.volumeNames = _.map(a.deploymentConfig.spec.template.spec.volumes, "name"), a.strategyData = angular.copy(a.deploymentConfig.spec.strategy), a.originalStrategy = a.strategyData.type, a.strategyParamsPropertyName = o(a.strategyData.type), a.triggers.hasConfigTrigger = _.some(a.updatedDeploymentConfig.spec.triggers, { type:"ConfigChange" }), "Custom" !== a.strategyData.type || _.has(a.strategyData, "customParams.environment") || (a.strategyData.customParams.environment = []), i.list("secrets", e, function(b) { var c = l.groupSecretsByType(b), d = _.mapValues(c, function(a) { return _.map(a, "metadata.name"); }); a.secretsByType = _.each(d, function(a) { a.unshift(""); }); }), n.push(i.watchObject("deploymentconfigs", d.deploymentconfig, e, function(b, c) { "MODIFIED" === c && (a.alerts["updated/deleted"] = { type:"warning", message:"This deployment configuration has changed since you started editing it. You'll need to copy any changes you've made and edit again." }), "DELETED" === c && (a.alerts["updated/deleted"] = { type:"warning", message:"This deployment configuration has been deleted." }, a.disableInputs = !0), a.deploymentConfig = b; })), a.loaded = !0; }, function(c) { a.loaded = !0, a.alerts.load = { type:"error", message:"The deployment configuration details could not be loaded.", details:b("getErrorDetails")(c) }; }) :void j.toErrorPage("You do not have authority to update deployment config " + d.deploymentconfig + ".", "access_denied"); })); var p = function() { return "Custom" !== a.strategyData.type && "Custom" !== a.originalStrategy && a.strategyData.type !== a.originalStrategy; }, q = function(b) { if (!_.has(a.strategyData, b)) { var c = e.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { alerts:a.alerts, message:"Some of your existing " + a.originalStrategy.toLowerCase() + " strategy parameters can be used for the " + a.strategyData.type.toLowerCase() + " strategy. Keep parameters?", details:"The timeout parameter and any pre or post lifecycle hooks will be copied from " + a.originalStrategy.toLowerCase() + " strategy to " + a.strategyData.type.toLowerCase() + " strategy. After saving the changes, " + a.originalStrategy.toLowerCase() + " strategy parameters will be removed.", okButtonText:"Yes", okButtonClass:"btn-primary", cancelButtonText:"No" }; } } }); c.result.then(function() { a.strategyData[b] = angular.copy(a.strategyData[o(a.originalStrategy)]); }, function() { a.strategyData[b] = {}; }); } }; a.strategyChanged = function() { var b = o(a.strategyData.type); p() ? q(b) :_.has(a.strategyData, b) || ("Custom" !== a.strategyData.type ? a.strategyData[b] = {} :a.strategyData[b] = { image:"", command:[], environment:[] }), a.strategyParamsPropertyName = b; }; var r = function(a, b, c, d) { var e = { kind:"ImageStreamTag", namespace:b.namespace, name:b.imageStream + ":" + b.tagObject.tag }; return c ? (c.imageChangeParams.from = e, c.imageChangeParams.automatic = d) :c = { type:"ImageChange", imageChangeParams:{ automatic:d, containerNames:[ a ], from:e } }, c; }, s = function() { var b = _.reject(a.updatedDeploymentConfig.spec.triggers, function(a) { return "ImageChange" === a.type || "ConfigChange" === a.type; }); return _.each(a.containerConfigByName, function(c, d) { if (c.hasDeploymentTrigger) b.push(r(d, c.triggerData.istag, c.triggerData.data, c.triggerData.automatic)); else { var e = _.find(a.updatedDeploymentConfig.spec.template.spec.containers, { name:d }); e.image = c.image; } }), a.triggers.hasConfigTrigger && b.push({ type:"ConfigChange" }), b; }; a.save = function() { a.disableInputs = !0, _.each(a.containerConfigByName, function(b, c) { var d = _.find(a.updatedDeploymentConfig.spec.template.spec.containers, { name:c }); d.env = m.compactEntries(b.env); }), p() && delete a.strategyData[o(a.originalStrategy)], "Custom" !== a.strategyData.type && _.each([ "pre", "mid", "post" ], function(b) { _.has(a.strategyData, [ a.strategyParamsPropertyName, b, "execNewPod", "env" ]) && (a.strategyData[a.strategyParamsPropertyName][b].execNewPod.env = m.compactEntries(a.strategyData[a.strategyParamsPropertyName][b].execNewPod.env)); }), _.has(a, "strategyData.customParams.environment") && (a.strategyData.customParams.environment = m.compactEntries(a.strategyData.customParams.environment)), a.updatedDeploymentConfig.spec.template.spec.imagePullSecrets = _.filter(a.secrets.pullSecrets, "name"), a.updatedDeploymentConfig.spec.strategy = a.strategyData, a.updatedDeploymentConfig.spec.triggers = s(), i.update("deploymentconfigs", a.updatedDeploymentConfig.metadata.name, a.updatedDeploymentConfig, a.context).then(function() { f.addAlert({ name:a.updatedDeploymentConfig.metadata.name, data:{ type:"success", message:"Deployment config " + a.updatedDeploymentConfig.metadata.name + " was successfully updated." } }); var b = j.resourceURL(a.updatedDeploymentConfig); c.url(b); }, function(c) { a.disableInputs = !1, a.alerts.save = { type:"error", message:"An error occurred updating deployment config " + a.updatedDeploymentConfig.metadata.name + ".", details:b("getErrorDetails")(c) }; }); }, a.$on("$destroy", function() { i.unwatchAll(n); }); } ]), angular.module("openshiftConsole").controller("EditAutoscalerController", [ "$scope", "$filter", "$routeParams", "$window", "APIService", "AuthorizationService", "BreadcrumbsService", "DataService", "HPAService", "MetricsService", "Navigate", "ProjectsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { if (!c.kind || !c.name) return void k.toErrorPage("Kind or name parameter missing."); var n = [ "Deployment", "DeploymentConfig", "HorizontalPodAutoscaler", "ReplicaSet", "ReplicationController" ]; if (!_.includes(n, c.kind)) return void k.toErrorPage("Autoscaling not supported for kind " + c.kind + "."); a.kind = c.kind, a.name = c.name, "HorizontalPodAutoscaler" === c.kind ? a.disableInputs = !0 :(a.targetKind = c.kind, a.targetName = c.name), a.autoscaling = { name:a.name }, a.labels = [], j.isAvailable().then(function(b) { a.metricsWarning = !b; }), a.alerts = {}; var o = b("getErrorDetails"), p = function(b, c) { a.alerts.autoscaling = { type:"error", message:b, details:o(c) }; }; l.get(c.project).then(_.spread(function(b, j) { a.project = b; var l = "HorizontalPodAutoscaler" === c.kind ? "update" :"create"; if (!f.canI({ resource:"horizontalpodautoscalers", group:"extensions" }, l, c.project)) return void k.toErrorPage("You do not have authority to " + l + " horizontal pod autoscalers in project " + c.project + ".", "access_denied"); var n = function() { a.disableInputs = !0; var b = { apiVersion:"extensions/v1beta1", kind:"HorizontalPodAutoscaler", metadata:{ name:a.autoscaling.name, labels:m.mapEntries(m.compactEntries(a.labels)) }, spec:{ scaleRef:{ kind:c.kind, name:c.name, apiVersion:"extensions/v1beta1", subresource:"scale" }, minReplicas:a.autoscaling.minReplicas, maxReplicas:a.autoscaling.maxReplicas, cpuUtilization:{ targetPercentage:a.autoscaling.targetCPU || a.autoscaling.defaultTargetCPU } } }; h.create({ resource:"horizontalpodautoscalers", group:"extensions" }, null, b, j).then(function() { d.history.back(); }, function(b) { a.disableInputs = !1, p("An error occurred creating the horizontal pod autoscaler.", b); }); }, o = function(b) { a.disableInputs = !0, b = angular.copy(b), b.metadata.labels = m.mapEntries(m.compactEntries(a.labels)), b.spec.minReplicas = a.autoscaling.minReplicas, b.spec.maxReplicas = a.autoscaling.maxReplicas, b.spec.cpuUtilization = { targetPercentage:a.autoscaling.targetCPU || a.autoscaling.defaultTargetCPU }, h.update({ resource:"horizontalpodautoscalers", group:"extensions" }, b.metadata.name, b, j).then(function() { d.history.back(); }, function(c) { a.disableInputs = !1, p('An error occurred updating horizontal pod autoscaler "' + b.metadata.name + '".', c); }); }, q = { resource:e.kindToResource(c.kind), group:c.group }; h.get(q, c.name, j).then(function(d) { if (a.labels = _.map(_.get(d, "metadata.labels", {}), function(a, b) { return { name:b, value:a }; }), "HorizontalPodAutoscaler" === c.kind) a.targetKind = _.get(d, "spec.scaleRef.kind"), a.targetName = _.get(d, "spec.scaleRef.name"), _.assign(a.autoscaling, { minReplicas:_.get(d, "spec.minReplicas"), maxReplicas:_.get(d, "spec.maxReplicas"), targetCPU:_.get(d, "spec.cpuUtilization.targetPercentage") }), a.disableInputs = !1, a.save = function() { o(d); }, a.breadcrumbs = g.getBreadcrumbs({ name:a.targetName, kind:a.targetKind, namespace:c.project, project:b, subpage:"Autoscale", includeProject:!0 }); else { a.breadcrumbs = g.getBreadcrumbs({ object:d, project:b, subpage:"Autoscale", includeProject:!0 }), a.save = n; var e = {}, f = function() { var c = _.get(d, "spec.template.spec.containers", []); a.showCPURequestWarning = !i.hasCPURequest(c, e, b); }; h.list("limitranges", j, function(a) { e = a.by("metadata.name"), f(); }); } }); })); } ]), angular.module("openshiftConsole").controller("EditHealthChecksController", [ "$filter", "$location", "$routeParams", "$scope", "AlertMessageService", "AuthorizationService", "BreadcrumbsService", "APIService", "DataService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k) { if (!c.kind || !c.name) return void j.toErrorPage("Kind or name parameter missing."); var l = [ "Deployment", "DeploymentConfig", "ReplicaSet", "ReplicationController" ]; if (!_.includes(l, c.kind)) return void j.toErrorPage("Health checks are not supported for kind " + c.kind + "."); d.name = c.name, d.resourceURL = j.resourceURL(d.name, c.kind, c.project), d.alerts = {}, d.renderOptions = { hideFilterWidget:!0 }, d.breadcrumbs = g.getBreadcrumbs({ name:c.name, kind:c.kind, namespace:c.project, subpage:"Edit Health Checks", includeProject:!0 }), d.previousProbes = {}; var m = a("getErrorDetails"), n = function(a, b) { d.alerts["add-health-check"] = { type:"error", message:a, details:b }; }; k.get(c.project).then(_.spread(function(k, l) { var o = a("humanizeKind")(c.kind) + ' "' + d.name + '"', p = { resource:h.kindToResource(c.kind), group:c.group }; return f.canI(p, "update", c.project) ? void i.get(p, d.name, l).then(function(a) { var f = angular.copy(a); d.breadcrumbs = g.getBreadcrumbs({ object:f, project:k, subpage:"Edit Health Checks", includeProject:!0 }), d.containers = _.get(f, "spec.template.spec.containers"), d.addProbe = function(a, b) { a[b] = _.get(d.previousProbes, [ a.name, b ], {}), d.form.$setDirty(); }, d.removeProbe = function(a, b) { _.set(d.previousProbes, [ a.name, b ], a[b]), delete a[b], d.form.$setDirty(); }, d.save = function() { d.disableInputs = !0, i.update(h.kindToResource(c.kind), d.name, f, l).then(function() { e.addAlert({ name:d.name, data:{ type:"success", message:o + " was updated." } }), b.url(d.resourceURL); }, function(a) { d.disableInputs = !1, n(o + " could not be updated.", m(a)); }); }; }, function(a) { n(o + " could not be loaded.", m(a)); }) :void j.toErrorPage("You do not have authority to update " + o + ".", "access_denied"); })); } ]), angular.module("openshiftConsole").controller("EditRouteController", [ "$filter", "$location", "$routeParams", "$scope", "AlertMessageService", "AuthorizationService", "DataService", "Navigate", "ProjectsService", "RoutesService", function(a, b, c, d, e, f, g, h, i, j) { d.alerts = {}, d.renderOptions = { hideFilterWidget:!0 }, d.projectName = c.project, d.routeName = c.route, d.loading = !0, d.routeURL = h.resourceURL(d.routeName, "Route", d.projectName), d.breadcrumbs = [ { title:d.projectName, link:"project/" + d.projectName }, { title:"Routes", link:"project/" + d.projectName + "/browse/routes" }, { title:d.routeName, link:d.routeURL }, { title:"Edit" } ], i.get(c.project).then(_.spread(function(i, k) { if (d.project = i, d.breadcrumbs[0].title = a("displayName")(i), !f.canI("routes", "update", c.project)) return void h.toErrorPage("You do not have authority to update route " + c.routeName + ".", "access_denied"); var l, m = a("orderByDisplayName"); g.get("routes", d.routeName, k).then(function(a) { l = angular.copy(a); var b = _.get(l, "spec.host"), c = "Subdomain" === _.get(l, "spec.wildcardPolicy"); c && (b = "*." + j.getSubdomain(l)), d.routing = { service:_.get(l, "spec.to.name"), host:b, wildcardPolicy:_.get(l, "spec.wildcardPolicy"), path:_.get(l, "spec.path"), targetPort:_.get(l, "spec.port.targetPort"), tls:angular.copy(_.get(l, "spec.tls")) }, g.list("services", k, function(a) { var b = a.by("metadata.name"), c = _.get(l, "spec.to", {}); d.loading = !1, d.services = m(b), d.routing.to = { service:b[c.name], weight:c.weight }, d.routing.alternateServices = [], _.each(_.get(l, "spec.alternateBackends"), function(a) { return "Service" !== a.kind ? (h.toErrorPage('Editing routes with non-service targets is unsupported. You can edit the route with the "Edit YAML" action instead.'), !1) :void d.routing.alternateServices.push({ service:b[a.name], weight:a.weight }); }); }); }, function() { h.toErrorPage("Could not load route " + d.routeName + "."); }); var n = function() { var a = _.get(d, "routing.to.service.metadata.name"); _.set(l, "spec.to.name", a); var b = _.get(d, "routing.to.weight"); isNaN(b) || _.set(l, "spec.to.weight", b), l.spec.path = d.routing.path; var c = d.routing.targetPort; c ? _.set(l, "spec.port.targetPort", c) :delete l.spec.port, _.get(d, "routing.tls.termination") ? (l.spec.tls = d.routing.tls, "edge" !== l.spec.tls.termination && delete l.spec.tls.insecureEdgeTerminationPolicy) :delete l.spec.tls; var e = _.get(d, "routing.alternateServices", []); _.isEmpty(e) ? delete l.spec.alternateBackends :l.spec.alternateBackends = _.map(e, function(a) { return { kind:"Service", name:_.get(a, "service.metadata.name"), weight:a.weight }; }); }; d.updateRoute = function() { d.form.$valid && (d.disableInputs = !0, n(), g.update("routes", d.routeName, l, k).then(function() { e.addAlert({ name:d.routeName, data:{ type:"success", message:"Route " + d.routeName + " was successfully updated." } }), b.path(d.routeURL); }, function(b) { d.disableInputs = !1, d.alerts["update-route"] = { type:"error", message:"An error occurred updating route " + d.routeName + ".", details:a("getErrorDetails")(b) }; })); }; })); } ]), angular.module("openshiftConsole").controller("EditYAMLController", [ "$scope", "$filter", "$location", "$routeParams", "$window", "AlertMessageService", "APIService", "AuthorizationService", "BreadcrumbsService", "DataService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k, l) { if (!d.kind || !d.name) return void k.toErrorPage("Kind or name parameter missing."); var m = b("humanizeKind"); a.name = d.name, a.resourceURL = k.resourceURL(a.name, d.kind, d.project), a.breadcrumbs = [ { title:d.project, link:"project/" + d.project }, { title:d.name, link:d.returnURL }, { title:"Edit YAML" } ]; var n = function() { return d.returnURL ? void c.url(d.returnURL) :void e.history.back(); }, o = _.throttle(function() { a.$eval(function() { a.modified = !0; }); }, 1e3); a.aceLoaded = function(a) { var b = a.getSession(); b.setOption("tabSize", 2), b.setOption("useSoftTabs", !0), b.on("change", o); }; var p = []; l.get(d.project).then(_.spread(function(c, e) { var i = { resource:g.kindToResource(d.kind), group:d.group }; return h.canI(i, "update", d.project) ? (j.get(i, a.name, e).then(function(c) { var h = angular.copy(c); a.resource = h; var k = function(a) { return _.get(a, "metadata.resourceVersion"); }; h = angular.extend({ apiVersion:h.apiVersion, kind:h.kind }, h), _.set(a, "editor.model", jsyaml.safeDump(h)), a.save = function() { a.modified = !1; var c; try { c = jsyaml.safeLoad(a.editor.model); } catch (e) { return void (a.error = e); } if (c.kind !== h.kind) return void (a.error = { message:"Cannot change resource kind (original: " + h.kind + ", modified: " + (c.kind || "") + ")." }); var i = g.objectToResourceGroupVersion(h), k = g.objectToResourceGroupVersion(c); return k ? k.group !== i.group ? void (a.error = { message:"Cannot change resource group (original: " + (i.group || "") + ", modified: " + (k.group || "") + ")." }) :g.apiInfo(k) ? (a.updatingNow = !0, void j.update(k, a.resource.metadata.name, c, { namespace:a.resource.metadata.namespace }).then(function() { f.addAlert({ name:"edit-yaml", data:{ type:"success", message:m(d.kind, !0) + " " + d.name + " was successfully updated." } }), n(); }, function(c) { a.updatingNow = !1, a.error = { message:b("getErrorDetails")(c) }; })) :void (a.error = { message:g.unsupportedObjectKindOrVersion(c) }) :void (a.error = { message:g.invalidObjectKindOrVersion(c) }); }, a.cancel = function() { n(); }, p.push(j.watchObject(i, a.name, e, function(b, c) { a.resourceChanged = k(b) !== k(h), a.resourceDeleted = "DELETED" === c; }, { errorNotification:!1 })); }, function(a) { k.toErrorPage("Could not load " + m(d.kind) + " '" + d.name + "'. " + b("getErrorDetails")(a, !0)); }), void a.$on("$destroy", function() { j.unwatchAll(p); })) :void k.toErrorPage("You do not have authority to update " + m(d.kind) + " " + d.name + ".", "access_denied"); })); } ]), angular.module("openshiftConsole").controller("BrowseCategoryController", [ "$scope", "$filter", "$location", "$q", "$routeParams", "$uibModal", "AlertMessageService", "CatalogService", "Constants", "DataService", "LabelFilter", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { a.projectName = e.project; var n = function(b, c) { var d; return _.some(b, function(b) { if (d = _.find(b.items, { id:c })) { a.category = d; var e = _.get(d, "subcategories", []); return a.subcategories = [ { id:"", label:"" } ].concat(e), !0; } return !1; }), d; }, o = i.CATALOG_CATEGORIES, p = "none" === e.category ? "" :e.category; if (a.category = n(o, p), !a.category) return void l.toErrorPage("Catalog category " + e.category + " not found."); var q, r; return e.subcategory && (q = a.category, p = "none" === e.subcategory ? "" :e.subcategory, r = _.get(a.category, "subcategories", []), a.category = n(r, p), !a.category) ? void l.toErrorPage("Catalog category " + e.category + "/" + e.subcategory + " not found.") :(a.alerts = a.alerts || {}, g.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), g.clearAlerts(), a.breadcrumbs = [ { title:a.projectName, link:"project/" + a.projectName }, { title:"Add to Project", link:"project/" + a.projectName + "/create" }, { title:"Catalog", link:"project/" + a.projectName + "/create?tab=fromCatalog" } ], q && a.breadcrumbs.push({ title:q.label, link:"project/" + a.projectName + "/create/category/" + q.id }), a.breadcrumbs.push({ title:a.category.label }), void m.get(e.project).then(_.spread(function(c, d) { a.project = c, a.context = d, a.breadcrumbs[0].title = b("displayName")(c), j.list("imagestreams", { namespace:"openshift" }, function(b) { a.openshiftImageStreams = b.by("metadata.name"); }), j.list("templates", { namespace:"openshift" }, function(b) { a.openshiftTemplates = b.by("metadata.name"); }), "openshift" === e.project ? (a.projectImageStreams = [], a.projectTemplates = []) :(j.list("imagestreams", d, function(b) { a.projectImageStreams = b.by("metadata.name"); }), j.list("templates", d, function(b) { a.projectTemplates = b.by("metadata.name"); })); }))); } ]), angular.module("openshiftConsole").controller("CreateFromImageController", [ "$scope", "Logger", "$q", "$routeParams", "APIService", "DataService", "ProjectsService", "Navigate", "ApplicationGenerator", "LimitRangesService", "MetricsService", "HPAService", "QuotaService", "SecretsService", "ImagesService", "TaskList", "failureObjectNameFilter", "$filter", "$parse", "$uibModal", "SOURCE_URL_PATTERN", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) { var w = r("displayName"), x = r("humanize"); a.projectName = d.project, a.sourceURLPattern = u; var y = d.imageStream; if (!y) return void h.toErrorPage("Cannot create from source: a base image was not specified"); if (!d.imageTag) return void h.toErrorPage("Cannot create from source: a base image tag was not specified"); a.displayName = d.displayName, a.breadcrumbs = [ { title:a.projectName, link:"project/" + a.projectName }, { title:"Add to Project", link:"project/" + a.projectName + "/create" }, { title:"Catalog", link:"project/" + a.projectName + "/create?tab=fromCatalog" }, { title:d.displayName || y } ], a.alerts = {}; var z = { name:"app", value:"" }; g.get(d.project).then(_.spread(function(e, g) { function q(b) { b.emptyMessage = "Loading...", b.name = d.name, b.imageName = y, b.imageTag = d.imageTag, b.namespace = d.namespace, b.buildConfig = { buildOnSourceChange:!0, buildOnImageChange:!0, buildOnConfigChange:!0, secrets:{ gitSecret:[ { name:"" } ] }, sourceUrl:d.sourceURI, gitRef:d.sourceRef, contextDir:d.contextDir }, b.buildConfigEnvVars = [], b.deploymentConfig = { deployOnNewImage:!0, deployOnConfigChange:!0 }, b.DCEnvVarsFromImage, b.DCEnvVarsFromUser = [], b.routing = { include:!0, portOptions:[] }, b.userDefinedLabels = [], b.systemLabels = [ z ], b.annotations = {}, b.scaling = { replicas:1, autoscale:!1, autoscaleOptions:[ { label:"Manual", value:!1 }, { label:"Automatic", value:!0 } ] }, b.container = { resources:{} }, b.cpuRequestCalculated = j.isRequestCalculated("cpu", e), b.cpuLimitCalculated = j.isLimitCalculated("cpu", e), b.memoryRequestCalculated = j.isRequestCalculated("memory", e), b.fillSampleRepo = function() { var a; (b.image || b.image.metadata || b.image.metadata.annotations) && (a = b.image.metadata.annotations, b.buildConfig.sourceUrl = a.sampleRepo || "", b.buildConfig.gitRef = a.sampleRef || "", b.buildConfig.contextDir = a.sampleContextDir || "", (a.sampleRef || a.sampleContextDir) && (b.advancedSourceOptions = !0)); }, b.usingSampleRepo = function() { return b.buildConfig.sourceUrl === _.get(b, "image.metadata.annotations.sampleRepo"); }, k.isAvailable().then(function(b) { a.metricsWarning = !b; }), f.list("secrets", g, function(b) { var c = n.groupSecretsByType(b), d = _.mapValues(c, function(a) { return _.map(a, "metadata.name"); }); a.secretsByType = _.each(d, function(a) { a.unshift(""); }); }), f.get("imagestreams", b.imageName, { namespace:b.namespace || d.project }).then(function(a) { b.imageStream = a; var c = b.imageTag; f.get("imagestreamtags", a.metadata.name + ":" + c, { namespace:b.namespace }).then(function(a) { b.image = a.image, b.DCEnvVarsFromImage = o.getEnvironment(a); var c = i.parsePorts(a.image); 0 === c.length ? (b.routing.include = !1, b.routing.portOptions = []) :(b.routing.portOptions = _.map(c, function(a) { var b = i.getServicePort(a); return { port:b.name, label:b.targetPort + "/" + b.protocol }; }), b.routing.targetPort = b.routing.portOptions[0].port); }, function() { h.toErrorPage("Cannot create from source: the specified image could not be retrieved."); }); }, function() { h.toErrorPage("Cannot create from source: the specified image could not be retrieved."); }); } a.project = e, a.breadcrumbs[0].title = r("displayName")(e), d.sourceURI && (a.sourceURIinParams = !0); var s = function() { a.hideCPU || (a.cpuProblems = j.validatePodLimits(a.limitRanges, "cpu", [ a.container ], e)), a.memoryProblems = j.validatePodLimits(a.limitRanges, "memory", [ a.container ], e); }; f.list("limitranges", g, function(b) { a.limitRanges = b.by("metadata.name"), 0 !== r("hashSize")(b) && a.$watch("container", s, !0); }); var u, A, B = function() { return a.scaling.autoscale ? void (a.showCPURequestWarning = !l.hasCPURequest([ a.container ], a.limitRanges, e)) :void (a.showCPURequestWarning = !1); }; f.list("resourcequotas", g, function(a) { u = a.by("metadata.name"), b.log("quotas", u); }), f.list("appliedclusterresourcequotas", g, function(a) { A = a.by("metadata.name"), b.log("cluster quotas", A); }), a.$watch("scaling.autoscale", B), a.$watch("container", B, !0), a.$watch("name", function(a) { z.value = a; }), q(a); var C, D = function() { var b = { started:"Creating application " + a.name + " in project " + a.projectDisplayName(), success:"Created application " + a.name + " in project " + a.projectDisplayName(), failure:"Failed to create " + a.name + " in project " + a.projectDisplayName() }, e = {}; p.clear(), p.add(b, e, d.project, function() { var b = c.defer(); return f.batch(C, g).then(function(c) { var d = [], e = !1; c.failure.length > 0 ? (e = !0, c.failure.forEach(function(a) { d.push({ type:"error", message:"Cannot create " + x(a.object.kind).toLowerCase() + ' "' + a.object.metadata.name + '". ', details:a.data.message }); }), c.success.forEach(function(a) { d.push({ type:"success", message:"Created " + x(a.kind).toLowerCase() + ' "' + a.metadata.name + '" successfully. ' }); })) :d.push({ type:"success", message:"All resources for application " + a.name + " were created successfully." }), b.resolve({ alerts:d, hasErrors:e }); }), b.promise; }, function(b) { a.alerts.create = { type:"error", message:"An error occurred creating the application.", details:"Status: " + b.status + ". " + b.data }; }), h.toNextSteps(a.name, a.projectName, a.usingSampleRepo() ? { fromSample:!0 } :null); }, E = function(a) { var b = t.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { alerts:a, message:"Problems were detected while checking your application configuration.", okButtonText:"Create Anyway", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }; } } }); b.result.then(D); }, F = function(b) { var c = b.quotaAlerts || [], d = _.filter(c, { type:"error" }); a.nameTaken || d.length ? (a.disableInputs = !1, a.alerts = c) :c.length ? (E(c), a.disableInputs = !1) :D(); }; a.projectDisplayName = function() { return w(this.project) || this.projectName; }, a.createApp = function() { a.disableInputs = !0, a.alerts = {}, a.buildConfig.envVars = v.mapEntries(v.compactEntries(a.buildConfigEnvVars)), a.deploymentConfig.envVars = v.mapEntries(v.compactEntries(a.DCEnvVarsFromUser)); var c = v.mapEntries(v.compactEntries(a.userDefinedLabels)), d = v.mapEntries(v.compactEntries(a.systemLabels)); a.labels = _.extend(d, c); var e = i.generate(a); C = [], angular.forEach(e, function(a) { null !== a && (b.debug("Generated resource definition:", a), C.push(a)); }); var f = i.ifResourcesDontExist(C, a.projectName), h = m.getLatestQuotaAlerts(C, g), j = function(b) { return a.nameTaken = b.nameTaken, h; }; f.then(j, j).then(F, F); }; })); } ]), angular.module("openshiftConsole").controller("NextStepsController", [ "$scope", "$http", "$routeParams", "DataService", "$q", "$location", "ProcessedTemplateService", "TaskList", "$parse", "Navigate", "Logger", "$filter", "imageObjectRefFilter", "failureObjectNameFilter", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) { function p() { return v && u; } function q() { return s && t && u; } var r = (l("displayName"), []); a.emptyMessage = "Loading...", a.alerts = [], a.loginBaseUrl = d.openshiftAPIBaseUrl(), a.buildConfigs = {}, a.showParamsTable = !1, a.projectName = c.project; var s = c.imageStream, t = c.imageTag, u = c.namespace; a.fromSampleRepo = c.fromSample; var v = c.template, w = "", x = ""; q() ? (w = "project/" + a.projectName + "/create/fromimage?imageName=" + s + "&imageTag=" + t + "&namespace=" + u + "&name=" + x, x = s + ":" + t) :p() && (w = "project/" + a.projectName + "/create/fromtemplate?template=" + v + "&namespace=" + u, x = v), a.breadcrumbs = [ { title:a.projectName, link:"project/" + a.projectName }, { title:"Add to Project", link:"project/" + a.projectName + "/create" }, { title:x, link:w }, { title:"Next Steps" } ]; var y = g.getTemplateData(); a.parameters = y.params, _.each(a.parameters, function(a) { l("altTextForValueFrom")(a); }), a.templateMessage = y.message, g.clearTemplateData(), o.get(c.project).then(_.spread(function(b, c) { function e(a) { var b = []; return angular.forEach(a, function(a) { a.hasErrors && b.push(a); }), b; } function f(a) { var b = []; return angular.forEach(a, function(a) { "completed" !== a.status && b.push(a); }), b; } return a.project = b, a.breadcrumbs[0].title = l("displayName")(b), x ? (r.push(d.watch("buildconfigs", c, function(b) { a.buildConfigs = b.by("metadata.name"), a.createdBuildConfig = a.buildConfigs[x], k.log("buildconfigs (subscribe)", a.buildConfigs); })), a.createdBuildConfigWithGitHubTrigger = function() { return _.some(_.get(a, "createdBuildConfig.spec.triggers"), { type:"GitHub" }); }, a.createdBuildConfigWithConfigChangeTrigger = function() { return _.some(_.get(a, "createdBuildConfig.spec.triggers"), { type:"ConfigChange" }); }, a.allTasksSuccessful = function(a) { return !f(a).length && !e(a).length; }, a.toggleParamsTable = function() { a.showParamsTable = !0; }, a.erroredTasks = e, a.pendingTasks = f, void a.$on("$destroy", function() { d.unwatchAll(r); })) :void j.toProjectOverview(a.projectName); })); } ]), angular.module("openshiftConsole").controller("NewFromTemplateController", [ "$scope", "$http", "$routeParams", "DataService", "ProcessedTemplateService", "AlertMessageService", "ProjectsService", "QuotaService", "$q", "$location", "TaskList", "$parse", "Navigate", "$filter", "$uibModal", "imageObjectRefFilter", "failureObjectNameFilter", "CachedTemplateService", "keyValueEditorUtils", "Constants", function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) { var u = c.template, v = c.namespace || ""; if (!u) return void m.toErrorPage("Cannot create from template: a template name was not specified."); a.emptyMessage = "Loading...", a.alerts = {}, a.alertsTop = {}, a.projectName = c.project, a.projectPromise = $.Deferred(), a.labels = [], a.systemLabels = [], a.breadcrumbs = [ { title:a.projectName, link:"project/" + a.projectName }, { title:"Add to Project", link:"project/" + a.projectName + "/create" }, { title:"Catalog", link:"project/" + a.projectName + "/create?tab=fromCatalog" }, { title:u } ], a.alerts = a.alerts || {}, f.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), f.clearAlerts(); var w = n("displayName"), x = n("humanize"), y = l("spec.template.spec.containers"), z = l("spec.strategy.sourceStrategy.from || spec.strategy.dockerStrategy.from || spec.strategy.customStrategy.from"), A = l("spec.output.to"), B = function() { try { return JSON.parse(c.templateParamsMap); } catch (b) { a.alertsTop.invalidTemplateParams = { type:"error", message:"The templateParamsMap is not valid JSON. " + b }; } }; g.get(c.project).then(_.spread(function(b, f) { function g(a, b) { var c = _.get(a, "spec.triggers", []), d = _.find(c, function(a) { if ("ImageChange" !== a.type) return !1; var c = _.get(a, "imageChangeParams.containerNames", []); return _.includes(c, b.name); }); return _.get(d, "imageChangeParams.from.name"); } function l(a) { for (var b = [], c = G.exec(a); c; ) b.push(c[1]), c = G.exec(a); return b; } function q() { var b = {}; return _.each(a.template.parameters, function(a) { b[a.name] = a.value; }), b; } function t() { var b = q(); a.templateImages = _.map(H, function(a) { if (_.isEmpty(a.usesParameters)) return a; var c = _.template(a.name, { interpolate:G }); return { name:c(b), usesParameters:a.usesParameters }; }); } function C(a) { var b = [], c = y(a); return c && angular.forEach(c, function(c) { var d = c.image, e = g(a, c); e && (d = e), d && b.push(d); }), b; } function D(b) { H = []; var c = [], d = {}; angular.forEach(b.objects, function(b) { if ("BuildConfig" === b.kind) { var e = p(z(b), a.projectName); e && H.push({ name:e, usesParameters:l(e) }); var f = p(A(b), a.projectName); f && (d[f] = !0); } "DeploymentConfig" === b.kind && (c = c.concat(C(b))); }), c.forEach(function(a) { d[a] || H.push({ name:a, usesParameters:l(a) }); }), H = _.uniq(H, !1, "name"); } function E(a) { var b = /^helplink\.(.*)\.title$/, c = /^helplink\.(.*)\.url$/, d = {}; for (var e in a.annotations) { var f, g = e.match(b); g ? (f = d[g[1]] || {}, f.title = a.annotations[e], d[g[1]] = f) :(g = e.match(c), g && (f = d[g[1]] || {}, f.url = a.annotations[e], d[g[1]] = f)); } return d; } function F(b) { if (a.parameterDisplayNames = {}, _.each(a.template.parameters, function(b) { a.parameterDisplayNames[b.name] = b.displayName || b.name; }), c.templateParamsMap) { var d = B(); _.each(a.template.parameters, function(a) { d[a.name] && (a.value = d[a.name]); }); } D(a.template); var e = function(a) { return !_.isEmpty(a.usesParameters); }; _.some(H, e) ? a.$watch("template.parameters", _.debounce(function(b) { a.$apply(t); }, 50, { maxWait:250 }), !0) :a.templateImages = H, a.systemLabels = _.map(a.template.labels, function(a, b) { return { name:b, value:a }; }), M() && a.systemLabels.push({ name:"app", value:a.template.metadata.name }); } a.project = b, a.breadcrumbs[0].title = n("displayName")(b); var G = /\${([a-zA-Z0-9\_]+)}/g, H = []; a.projectDisplayName = function() { return w(this.project) || this.projectName; }, a.templateDisplayName = function() { return w(this.template); }; var I, J = function() { var b = { started:"Creating " + a.templateDisplayName() + " in project " + a.projectDisplayName(), success:"Created " + a.templateDisplayName() + " in project " + a.projectDisplayName(), failure:"Failed to create " + a.templateDisplayName() + " in project " + a.projectDisplayName() }, e = E(a.template); k.clear(), k.add(b, e, c.project, function() { var b = i.defer(); return d.batch(I, f).then(function(c) { var d = [], e = !1; c.failure.length > 0 ? (e = !0, c.failure.forEach(function(a) { d.push({ type:"error", message:"Cannot create " + x(a.object.kind).toLowerCase() + ' "' + a.object.metadata.name + '". ', details:a.data.message }); }), c.success.forEach(function(a) { d.push({ type:"success", message:"Created " + x(a.kind).toLowerCase() + ' "' + a.metadata.name + '" successfully. ' }); })) :d.push({ type:"success", message:"All items in template " + a.templateDisplayName() + " were created successfully." }), b.resolve({ alerts:d, hasErrors:e }); }), b.promise; }), m.toNextSteps(c.name, a.projectName); }, K = function(a) { var b = o.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { alerts:a, message:"Problems were detected while checking your application configuration.", okButtonText:"Create Anyway", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }; } } }); b.result.then(J); }, L = function(b) { var c = b.quotaAlerts || [], d = _.filter(c, { type:"error" }); d.length ? (a.disableInputs = !1, a.alerts = c) :c.length ? (K(c), a.disableInputs = !1) :J(); }; a.createFromTemplate = function() { a.disableInputs = !0; var b = s.mapEntries(s.compactEntries(a.labels)), c = s.mapEntries(s.compactEntries(a.systemLabels)); a.template.labels = _.extend(c, b), d.create("processedtemplates", null, a.template, f).then(function(b) { e.setTemplateData(b.parameters, a.template.parameters, b.message), I = b.objects, h.getLatestQuotaAlerts(I, f).then(L); }, function(b) { a.disableInputs = !1; var c; b.data && b.data.message && (c = b.data.message), a.alerts.process = { type:"error", message:"An error occurred processing the template.", details:c }; }); }; var M = function() { return !_.get(a.template, "labels.app") && !_.some(a.template.objects, "metadata.labels.app"); }; if (v) d.get("templates", u, { namespace:v || a.projectName }).then(function(b) { a.template = b, F(), a.breadcrumbs[3].title = n("displayName")(b); }, function() { m.toErrorPage("Cannot create from template: the specified template could not be retrieved."); }); else { if (a.template = r.getTemplate(), _.isEmpty(a.template)) { var N = URI("error").query({ error:"not_found", error_description:"Template wasn't found in cache." }).toString(); j.url(N); } r.clearTemplate(), F(); } })); } ]), angular.module("openshiftConsole").controller("LabelsController", [ "$scope", function(a) { a.expanded = !0, a.toggleExpanded = function() { a.expanded = !a.expanded; }, a.addLabel = function() { a.labelKey && a.labelValue && (a.labels[a.labelKey] = a.labelValue, a.labelKey = "", a.labelValue = "", a.form.$setPristine(), a.form.$setUntouched()); }, a.deleteLabel = function(b) { a.labels[b] && delete a.labels[b]; }; } ]), angular.module("openshiftConsole").controller("TasksController", [ "$scope", "TaskList", function(a, b) { a.tasks = function() { return b.taskList(); }, a["delete"] = function(a) { b.deleteTask(a); }, a.hasTaskWithError = function() { var a = b.taskList(); return _.some(a, { hasErrors:!0 }); }; } ]), angular.module("openshiftConsole").controller("EventsController", [ "$routeParams", "$scope", "ProjectsService", function(a, b, c) { b.projectName = a.project, b.renderOptions = { hideFilterWidget:!0 }, b.breadcrumbs = [ { title:"Monitoring", link:"project/" + a.project + "/monitoring" }, { title:"Events" } ], c.get(a.project).then(_.spread(function(a, c) { b.project = a, b.projectContext = c; })); } ]), angular.module("openshiftConsole").controller("OAuthController", [ "$scope", "$location", "$q", "RedirectLoginService", "DataService", "AuthService", "Logger", function(a, b, c, d, e, f, g) { var h = g.get("auth"); a.completeLogin = function() {}, a.cancelLogin = function() { b.replace(), b.url("./"); }, d.finish().then(function(c) { var d = c.token, g = c.then, i = c.verified, j = c.ttl, k = { errorNotification:!1, http:{ auth:{ token:d, triggerLogin:!1 } } }; h.log("OAuthController, got token, fetching user", k), e.get("users", "~", {}, k).then(function(c) { if (h.log("OAuthController, got user", c), a.completeLogin = function() { f.setUser(c, d, j); var a = g || "./"; URI(a).is("absolute") && (h.log("OAuthController, invalid absolute redirect", a), a = "./"), h.log("OAuthController, redirecting", a), b.replace(), b.url(a); }, i) a.completeLogin(); else { a.confirmUser = c; var e = f.UserStore().getUser(); e && e.metadata.name !== c.metadata.name && (a.overriddenUser = e); } })["catch"](function(a) { var c = URI("error").query({ error:"user_fetch_failed" }).toString(); h.error("OAuthController, error fetching user", a, "redirecting", c), b.replace(), b.url(c); }); })["catch"](function(a) { var c = URI("error").query({ error:a.error || "", error_description:a.error_description || "", error_uri:a.error_uri || "" }).toString(); h.error("OAuthController, error", a, "redirecting", c), b.replace(), b.url(c); }); } ]), angular.module("openshiftConsole").controller("ErrorController", [ "$scope", "$window", function(a, b) { var c = URI(window.location.href).query(!0), d = c.error; switch (d) { case "access_denied": a.errorMessage = "Access denied"; break; case "not_found": a.errorMessage = "Not found"; break; case "invalid_request": a.errorMessage = "Invalid request"; break; case "API_DISCOVERY": a.errorLinks = [ { href:window.location.protocol + "//" + window.OPENSHIFT_CONFIG.api.openshift.hostPort + window.OPENSHIFT_CONFIG.api.openshift.prefix, label:"Check Server Connection", target:"_blank" } ]; break; default: a.errorMessage = "An error has occurred"; } c.error_description && (a.errorDetails = c.error_description), a.reloadConsole = function() { b.location.href = "/"; }; } ]), angular.module("openshiftConsole").controller("LogoutController", [ "$scope", "$log", "AuthService", "AUTH_CFG", function(a, b, c, d) { b.debug("LogoutController"), c.isLoggedIn() ? (b.debug("LogoutController, logged in, initiating logout"), a.logoutMessage = "Logging out...", c.startLogout()["finally"](function() { c.isLoggedIn() ? (b.debug("LogoutController, logout failed, still logged in"), a.logoutMessage = 'You could not be logged out. Return to the console.') :d.logout_uri ? (b.debug("LogoutController, logout completed, redirecting to AUTH_CFG.logout_uri", d.logout_uri), window.location.href = d.logout_uri) :(b.debug("LogoutController, logout completed, reloading the page"), window.location.reload(!1)); })) :d.logout_uri ? (b.debug("LogoutController, logout completed, redirecting to AUTH_CFG.logout_uri", d.logout_uri), a.logoutMessage = "Logging out...", window.location.href = d.logout_uri) :(b.debug("LogoutController, not logged in, logout complete"), a.logoutMessage = 'You are logged out. Return to the console.'); } ]), angular.module("openshiftConsole").controller("CreateController", [ "$scope", "$filter", "$location", "$q", "$routeParams", "$uibModal", "AlertMessageService", "CatalogService", "Constants", "DataService", "LabelFilter", "Logger", "ProjectsService", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { a.projectName = e.project, a.categories = i.CATALOG_CATEGORIES, a.alerts = a.alerts || {}, g.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), g.clearAlerts(), a.breadcrumbs = [ { title:a.projectName, link:"project/" + a.projectName }, { title:"Add to Project" } ], m.get(e.project).then(_.spread(function(c, d) { a.project = c, a.context = d, a.breadcrumbs[0].title = b("displayName")(c), j.list("imagestreams", { namespace:"openshift" }, function(b) { a.openshiftImageStreams = b.by("metadata.name"); }), j.list("templates", { namespace:"openshift" }, function(b) { a.openshiftTemplates = b.by("metadata.name"); }), "openshift" === e.project ? (a.projectImageStreams = [], a.projectTemplates = []) :(j.list("imagestreams", d, function(b) { a.projectImageStreams = b.by("metadata.name"); }), j.list("templates", d, function(b) { a.projectTemplates = b.by("metadata.name"); })); })); } ]), angular.module("openshiftConsole").controller("CreateFromURLController", [ "$scope", "$routeParams", "$location", "$filter", "AuthService", "DataService", "AlertMessageService", "Navigate", "ProjectsService", function(a, b, c, d, e, f, g, h, i) { e.withUser(), g.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), g.clearAlerts(), a.alerts = {}, a.selected = {}; var j = function(b) { a.alerts.invalidImageStream = { type:"error", message:'The requested image stream "' + b + '" could not be loaded.' }; }, k = function(b) { a.alerts.invalidImageTag = { type:"error", message:'The requested image stream tag "' + b + '" could not be loaded.' }; }, l = function(b) { a.alerts.invalidImageStream = { type:"error", message:'The app name "' + b + "\" is not valid. An app name is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character." }; }, m = function(b) { a.alerts.invalidNamespace = { type:"error", message:'Resources from the namespace "' + b + '" are not permitted.' }; }, n = function(b) { a.alerts.invalidTemplate = { type:"error", message:'The requested template "' + b + '" could not be loaded.' }; }, o = function() { a.alerts.resourceRequired = { type:"error", message:"An image stream or template is required." }; }, p = function() { a.alerts.invalidResource = { type:"error", message:"Image streams and templates cannot be combined." }; }, q = function() { try { return b.templateParamsMap && JSON.parse(b.templateParamsMap) || {}; } catch (c) { a.alerts.invalidTemplateParams = { type:"error", message:"The templateParamsMap is not valid JSON. " + c }; } }, r = window.OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST, s = [ "namespace", "name", "imageStream", "imageTag", "sourceURI", "sourceRef", "contextDir", "template", "templateParamsMap" ], t = _.pick(b, function(a, b) { return _.contains(s, b) && _.isString(a); }); t.namespace = t.namespace || "openshift"; var u = function(a) { return a.length < 25 && /^[a-z]([-a-z0-9]*[a-z0-9])?$/.test(a); }, v = function() { t.imageStream && f.get("imagestreams", t.imageStream, { namespace:t.namespace }, { errorNotification:!1 }).then(function(b) { a.imageStream = b, f.get("imagestreamtags", b.metadata.name + ":" + t.imageTag, { namespace:t.namespace }, { errorNotification:!1 }).then(function(b) { a.imageStreamTag = b, a.validationPassed = !0, a.resource = b, t.displayName = d("displayName")(b); }, function() { k(t.imageTag); }); }, function() { j(t.imageStream); }), t.template && f.get("templates", t.template, { namespace:t.namespace }, { errorNotification:!1 }).then(function(b) { a.template = b, q() && (a.validationPassed = !0, a.resource = b); }, function() { n(t.template); }); }; _.includes(r, t.namespace) ? t.imageStream && t.template ? p() :t.imageStream || t.template ? t.name && !u(t.name) ? l(t.name) :v() :o() :m(t.namespace), angular.extend(a, { createDetails:t, createWithProject:function(d) { d = d || a.selected.project.metadata.name; var e = b.imageStream ? h.createFromImageURL(a.imageStream, t.imageTag, d, t) :h.createFromTemplateURL(a.template, d, t); c.url(e); } }), a.projects = {}, a.canCreateProject = void 0, f.list("projects", a).then(function(b) { a.loaded = !0, a.projects = d("orderByDisplayName")(b.by("metadata.name")), a.noProjects = _.isEmpty(a.projects); }), i.canCreate().then(function() { a.canCreateProject = !0; }, function() { a.canCreateProject = !1; }); } ]), angular.module("openshiftConsole").controller("CreateProjectController", [ "$scope", "$location", "AuthService", "DataService", "AlertMessageService", function(a, b, c, d, e) { a.alerts = {}, c.withUser(), e.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), e.clearAlerts(); } ]), angular.module("openshiftConsole").controller("EditProjectController", [ "$scope", "$routeParams", "$filter", "$location", "DataService", "AlertMessageService", "ProjectsService", "Navigate", function(a, b, c, d, e, f, g, h) { a.alerts = {}, f.getAlerts().forEach(function(b) { a.alerts[b.name] = b.data; }), f.clearAlerts(); var i = c("annotation"), j = c("annotationName"); g.get(b.project).then(_.spread(function(e) { var f = function(a) { return { description:i(a, "description"), displayName:i(a, "displayName") }; }, k = function(a, b) { var c = angular.copy(a); return c.metadata.annotations[j("description")] = b.description, c.metadata.annotations[j("displayName")] = b.displayName, c; }; angular.extend(a, { project:e, editableFields:f(e), show:{ editing:!1 }, actions:{ canSubmit:!1 }, canSubmit:function(b) { a.actions.canSubmit = b; }, update:function() { a.disableInputs = !0, g.update(b.project, k(e, a.editableFields)).then(function() { b.then ? d.path(b.then) :h.toProjectOverview(e.metadata.name); }, function(b) { a.disableInputs = !1, a.editableFields = f(e), a.alerts.update = { type:"error", message:"An error occurred while updating the project", details:c("getErrorDetails")(b) }; }); } }); })); } ]), angular.module("openshiftConsole").controller("CreateRouteController", [ "$filter", "$routeParams", "$scope", "$window", "ApplicationGenerator", "AuthorizationService", "DataService", "Navigate", "ProjectsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j) { c.alerts = {}, c.renderOptions = { hideFilterWidget:!0 }, c.projectName = b.project, c.serviceName = b.service, c.labels = [], c.routing = { name:c.serviceName || "" }, c.breadcrumbs = [ { title:c.projectName, link:"project/" + c.projectName }, { title:"Routes", link:"project/" + c.projectName + "/browse/routes" }, { title:"Create Route" } ], i.get(b.project).then(_.spread(function(i, k) { if (c.project = i, c.breadcrumbs[0].title = a("displayName")(i), !f.canI("routes", "create", b.project)) return void h.toErrorPage("You do not have authority to create routes in project " + b.project + ".", "access_denied"); var l = a("orderByDisplayName"); g.list("services", k, function(a) { c.services = l(a.by("metadata.name")), c.routing.to = {}, c.routing.to.service = _.find(c.services, function(a) { return !c.serviceName || a.metadata.name === c.serviceName; }); }), c.copyServiceLabels = function() { var a = _.get(c, "routing.to.service.metadata.labels", {}), b = j.mapEntries(j.compactEntries(c.labels)), d = _.assign(b, a); c.labels = _.map(d, function(a, b) { return { name:b, value:a }; }); }, c.createRoute = function() { if (c.createRouteForm.$valid) { c.disableInputs = !0; var b = c.routing.to.service.metadata.name, f = j.mapEntries(j.compactEntries(c.labels)), h = e.createRoute(c.routing, b, f), i = _.get(c, "routing.alternateServices", []); _.isEmpty(i) || (h.spec.to.weight = _.get(c, "routing.to.weight"), h.spec.alternateBackends = _.map(i, function(a) { return { kind:"Service", name:_.get(a, "service.metadata.name"), weight:a.weight }; })), g.create("routes", null, h, k).then(function() { d.history.back(); }, function(b) { c.disableInputs = !1, c.alerts["create-route"] = { type:"error", message:"An error occurred creating the route.", details:a("getErrorDetails")(b) }; }); } }; })); } ]), angular.module("openshiftConsole").controller("AttachPVCController", [ "$filter", "$routeParams", "$scope", "$window", "APIService", "AuthorizationService", "BreadcrumbsService", "DataService", "Navigate", "ProjectsService", "StorageService", function(a, b, c, d, e, f, g, h, i, j, k) { if (!b.kind || !b.name) return void i.toErrorPage("Kind or name parameter missing."); var l = [ "Deployment", "DeploymentConfig", "ReplicaSet", "ReplicationController" ]; if (!_.includes(l, b.kind)) return void i.toErrorPage("Storage is not supported for kind " + b.kind + "."); var m = { resource:e.kindToResource(b.kind), group:b.group }; c.alerts = {}, c.renderOptions = { hideFilterWidget:!0 }, c.projectName = b.project, c.kind = b.kind, c.name = b.name, c.attach = { persistentVolumeClaim:null, volumeName:null, mountPath:null, allContainers:!0, containers:{} }, c.breadcrumbs = g.getBreadcrumbs({ name:b.name, kind:b.kind, namespace:b.project, subpage:"Add Storage", includeProject:!0 }), j.get(b.project).then(_.spread(function(e, j) { if (c.project = e, c.breadcrumbs[0].title = a("displayName")(e), !f.canI(m, "update", b.project)) return void i.toErrorPage("You do not have authority to update " + a("humanizeKind")(b.kind) + " " + b.name + ".", "access_denied"); var l = a("orderByDisplayName"), n = a("getErrorDetails"), o = a("generateName"), p = function(a, b) { c.disableInputs = !0, c.alerts["attach-persistent-volume-claim"] = { type:"error", message:a, details:b }; }, q = function(a) { return c.attach.allContainers || c.attach.containers[a.name]; }, r = function() { var a = _.get(c, "attach.resource.spec.template"); c.existingMountPaths = k.getMountPaths(a, q); }; c.$watchGroup([ "attach.resource", "attach.allContainers" ], r), c.$watch("attach.containers", r, !0); var s = function() { h.get(m, b.name, j).then(function(a) { c.attach.resource = a, c.breadcrumbs = g.getBreadcrumbs({ object:a, project:e, subpage:"Add Storage", includeProject:!0 }); var b = _.get(a, "spec.template"); c.existingVolumeNames = k.getVolumeNames(b); }, function(a) { p(b.name + " could not be loaded.", n(a)); }), h.list("persistentvolumeclaims", j, function(a) { c.pvcs = l(a.by("metadata.name")), _.isEmpty(c.pvcs) || c.attach.persistentVolumeClaim || (c.attach.persistentVolumeClaim = _.head(c.pvcs)); }); }; s(), c.attachPVC = function() { if (c.disableInputs = !0, c.attachPVCForm.$valid) { c.attach.volumeName || (c.attach.volumeName = o("volume-")); var e = c.attach.resource, f = _.get(e, "spec.template"), g = c.attach.persistentVolumeClaim, i = c.attach.volumeName, l = c.attach.mountPath; l && angular.forEach(f.spec.containers, function(a) { if (q(a)) { var b = k.createVolumeMount(i, l); a.volumeMounts || (a.volumeMounts = []), a.volumeMounts.push(b); } }); var r = k.createVolume(i, g); f.spec.volumes || (f.spec.volumes = []), f.spec.volumes.push(r), c.alerts = {}, h.update(m, e.metadata.name, c.attach.resource, j).then(function() { d.history.back(); }, function(d) { p("An error occurred attaching the persistent volume claim to the " + a("humanizeKind")(b.kind) + ".", n(d)), c.disableInputs = !1; }); } }; })); } ]), angular.module("openshiftConsole").controller("AddConfigVolumeController", [ "$filter", "$location", "$routeParams", "$scope", "$window", "APIService", "AuthorizationService", "BreadcrumbsService", "DataService", "Navigate", "ProjectsService", "StorageService", function(a, b, c, d, e, f, g, h, i, j, k, l) { if (!c.kind || !c.name) return void j.toErrorPage("Kind or name parameter missing."); var m = [ "Deployment", "DeploymentConfig", "ReplicaSet", "ReplicationController" ]; if (!_.includes(m, c.kind)) return void j.toErrorPage("Volumes are not supported for kind " + c.kind + "."); var n = { resource:f.kindToResource(c.kind), group:c.group }; d.alerts = {}, d.projectName = c.project, d.kind = c.kind, d.name = c.name, d.attach = { allContainers:!0, pickKeys:!1 }, d.forms = {}, d.breadcrumbs = h.getBreadcrumbs({ name:c.name, kind:c.kind, namespace:c.project, subpage:"Add Config Files", includeProject:!0 }), d.returnURL = b.url(); var o = a("humanizeKind"); d.groupByKind = function(a) { return o(a.kind); }; var p = function() { _.set(d, "attach.items", [ {} ]); }; d.$watch("attach.source", p); var q = function() { d.forms.addConfigVolumeForm.$setDirty(); }; d.addItem = function() { d.attach.items.push({}), q(); }, d.removeItem = function(a) { d.attach.items.splice(a, 1), q(); }, k.get(c.project).then(_.spread(function(b, f) { if (d.project = b, !g.canI(n, "update", c.project)) return void j.toErrorPage("You do not have authority to update " + o(c.kind) + " " + c.name + ".", "access_denied"); var k = a("orderByDisplayName"), m = a("getErrorDetails"), p = a("generateName"), q = function(a, b) { d.alerts["attach-persistent-volume-claim"] = { type:"error", message:a, details:b }; }; i.get(n, c.name, f, { errorNotification:!1 }).then(function(a) { d.targetObject = a, d.breadcrumbs = h.getBreadcrumbs({ object:a, project:b, subpage:"Add Config Files", includeProject:!0 }); }, function(a) { d.error = a; }), i.list("configmaps", f, null, { errorNotification:!1 }).then(function(a) { d.configMaps = k(a.by("metadata.name")); }, function(a) { return 403 === a.code ? void (d.configMaps = []) :void q("Could not load config maps", m(a)); }), i.list("secrets", f, null, { errorNotification:!1 }).then(function(a) { d.secrets = k(a.by("metadata.name")); }, function(a) { return 403 === a.code ? void (d.secrets = []) :void q("Could not load secrets", m(a)); }); var r = function(a) { return d.attach.allContainers || d.attach.containers[a.name]; }, s = function() { var a = _.get(d, "targetObject.spec.template"); d.existingMountPaths = l.getMountPaths(a, r); }; d.$watchGroup([ "targetObject", "attach.allContainers" ], s), d.$watch("attach.containers", s, !0); var t = function() { var a = _.map(d.attach.items, "path"); d.itemPaths = _.compact(a); }; d.$watch("attach.items", t, !0), d.addVolume = function() { if (!d.forms.addConfigVolumeForm.$invalid) { var b = d.targetObject, g = _.get(d, "attach.source"), h = _.get(b, "spec.template"), j = p("volume-"), k = _.get(d, "attach.mountPath"), l = { name:j, mountPath:k }; "Secret" === g.kind && (l.readOnly = !0), _.each(h.spec.containers, function(a) { r(a) && (a.volumeMounts = a.volumeMounts || [], a.volumeMounts.push(l)); }); var o, s = { name:j }; switch (d.attach.pickKeys && (o = d.attach.items), g.kind) { case "ConfigMap": s.configMap = { name:g.metadata.name, items:o }; break; case "Secret": s.secret = { secretName:g.metadata.name, items:o }; } h.spec.volumes = h.spec.volumes || [], h.spec.volumes.push(s), d.alerts = {}, d.disableInputs = !0, i.update(n, b.metadata.name, d.targetObject, f).then(function() { e.history.back(); }, function(b) { d.disableInputs = !1; var e = a("humanizeKind"), f = e(g.kind), h = e(c.kind); q("An error occurred attaching the " + f + " to the " + h + ".", m(b)); }); } }; })); } ]), angular.module("openshiftConsole").controller("CreateSecretModalController", [ "$scope", "$uibModalInstance", function(a, b) { a.postCreateAction = function(c, d) { b.close(c), _.each(d, function(b) { a.alerts[b.name] = b.data; }); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("ConfirmModalController", [ "$scope", "$uibModalInstance", "modalConfig", function(a, b, c) { _.extend(a, c), a.confirm = function() { b.close("confirm"); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("ConfirmScaleController", [ "$scope", "$uibModalInstance", "resource", "type", function(a, b, c, d) { a.resource = c, a.type = d, a.confirmScale = function() { b.close("confirmScale"); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("ConfirmSaveLogController", [ "$scope", "$uibModalInstance", "object", "CLIHelp", function(a, b, c, d) { a.object = c, a.command = d.getLogsCommand(c), a.save = function() { b.close("save"); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("DeleteModalController", [ "$scope", "$uibModalInstance", function(a, b) { a["delete"] = function() { b.close("delete"); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("DebugTerminalModalController", [ "$scope", "$filter", "$uibModalInstance", "container", "image", function(a, b, c, d, e) { a.container = d, a.image = e, a.$watch("debugPod.status.containerStatuses", function() { a.containerState = _.get(a, "debugPod.status.containerStatuses[0].state"); }), a.close = function() { c.close("close"); }; } ]), angular.module("openshiftConsole").controller("ConfirmReplaceModalController", [ "$scope", "$uibModalInstance", function(a, b) { a.replace = function() { b.close("replace"); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("ProcessTemplateModalController", [ "$scope", "$uibModalInstance", function(a, b) { a["continue"] = function() { b.close("create"); }, a.cancel = function() { b.dismiss("cancel"); }; } ]), angular.module("openshiftConsole").controller("LinkServiceModalController", [ "$scope", "$uibModalInstance", "ServicesService", function(a, b, c) { a.$watch("services", function(b) { var d = c.getDependentServices(a.service); a.options = _.filter(b, function(b) { return b !== a.service && !_.includes(d, b.metadata.name); }), 1 === _.size(a.options) && _.set(a, "link.selectedService", _.head(a.options)); }), a.link = function() { b.close(_.get(a, "link.selectedService")); }, a.cancel = function() { b.dismiss(); }; } ]), angular.module("openshiftConsole").controller("JenkinsfileExamplesModalController", [ "$scope", "$uibModalInstance", function(a, b) { a.ok = function() { b.close("ok"); }; } ]), angular.module("openshiftConsole").controller("AboutComputeUnitsModalController", [ "$scope", "$uibModalInstance", function(a, b) { a.ok = function() { b.close("ok"); }; } ]), angular.module("openshiftConsole").controller("AboutController", [ "$scope", "AuthService", "Constants", function(a, b, c) { b.withUser(), a.version = { master:{ openshift:c.VERSION.openshift, kubernetes:c.VERSION.kubernetes } }; } ]), angular.module("openshiftConsole").controller("CommandLineController", [ "$scope", "DataService", "AuthService", "Constants", function(a, b, c, d) { c.withUser(), a.cliDownloadURL = d.CLI, a.cliDownloadURLPresent = a.cliDownloadURL && !_.isEmpty(a.cliDownloadURL), a.loginBaseURL = b.openshiftAPIBaseUrl(), a.sessionToken = c.UserStore().getToken(), a.showSessionToken = !1, a.toggleShowSessionToken = function() { a.showSessionToken = !a.showSessionToken; }; } ]), angular.module("openshiftConsole").controller("CreatePersistentVolumeClaimController", [ "$filter", "$routeParams", "$scope", "$window", "ApplicationGenerator", "AuthorizationService", "DataService", "Navigate", "ProjectsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j) { c.alerts = {}, c.projectName = b.project, c.accessModes = "ReadWriteOnce", c.claim = {}, c.breadcrumbs = [ { title:c.projectName, link:"project/" + c.projectName }, { title:"Storage", link:"project/" + c.projectName + "/browse/storage" }, { title:"Create Storage" } ], i.get(b.project).then(_.spread(function(e, i) { function k() { var a = { kind:"PersistentVolumeClaim", apiVersion:"v1", metadata:{ name:c.claim.name, labels:{}, annotations:{} }, spec:{ resources:{ requests:{} } } }; a.spec.accessModes = [ c.claim.accessModes || "ReadWriteOnce" ]; var b = c.claim.unit || "Mi"; if (a.spec.resources.requests.storage = c.claim.amount + b, c.claim.selectedLabels) { var d = j.mapEntries(j.compactEntries(c.claim.selectedLabels)); _.isEmpty(d) || _.set(a, "spec.selector.matchLabels", d); } return c.claim.storageClass && (a.metadata.annotations["volume.beta.kubernetes.io/storage-class"] = c.claim.storageClass.metadata.name), a; } return c.project = e, c.breadcrumbs[0].title = a("displayName")(e), f.canI("persistentvolumeclaims", "create", b.project) ? void (c.createPersistentVolumeClaim = function() { if (c.createPersistentVolumeClaimForm.$valid) { c.disableInputs = !0; var b = k(); g.create("persistentvolumeclaims", null, b, i).then(function() { d.history.back(); }, function(b) { c.disableInputs = !1, c.alerts["create-persistent-volume-claim"] = { type:"error", message:"An error occurred requesting storage claim.", details:a("getErrorDetails")(b) }; }); } }) :void h.toErrorPage("You do not have authority to create persistent volume claims in project " + b.project + ".", "access_denied"); })); } ]), angular.module("openshiftConsole").directive("buildClose", [ "$window", function(a) { var b = function(a) { return "hide/build/" + a.metadata.uid; }, c = function(a) { var c = b(a); return "true" === sessionStorage.getItem(c); }; return { restrict:"AE", scope:{ build:"=", hideBuild:"=" }, controller:[ "$scope", function(a) { a.onHideBuild = function() { var c = b(a.build); a.hideBuild = !0, sessionStorage.setItem(c, "true"); }; } ], link:function(a, b, d, e) { a.hideBuild = !1, a.$watch("build", function(b) { a.hideBuild = c(b); }); }, templateUrl:"views/directives/_build-close.html" }; } ]), angular.module("openshiftConsole").directive("createProject", function() { return { restrict:"E", scope:{ alerts:"=", submitButtonLabel:"@", redirectAction:"&" }, templateUrl:"views/directives/_create-project-form.html", controller:[ "$scope", "$filter", "$location", "DataService", function(a, b, c, d) { a.submitButtonLabel || (a.submitButtonLabel = "Create"), a.createProject = function() { a.disableInputs = !0, a.createProjectForm.$valid && d.create("projectrequests", null, { apiVersion:"v1", kind:"ProjectRequest", metadata:{ name:a.name }, displayName:a.displayName, description:a.description }, a).then(function(b) { var d = a.redirectAction(); d ? d(encodeURIComponent(b.metadata.name)) :c.path("project/" + encodeURIComponent(b.metadata.name) + "/create"); }, function(b) { a.disableInputs = !1; var c = b.data || {}; if ("AlreadyExists" === c.reason) a.nameTaken = !0; else { var d = c.message || "An error occurred creating the project."; a.alerts["error-creating-project"] = { type:"error", message:d }; } }); }; } ] }; }), angular.module("openshiftConsole").directive("createSecret", [ "DataService", "AuthorizationService", "$filter", function(a, b, c) { return { restrict:"E", scope:{ type:"=", serviceAccountToLink:"=?", namespace:"=", postCreateAction:"&", cancel:"&" }, templateUrl:"views/directives/create-secret.html", link:function(d) { d.alerts = {}, d.secretAuthTypeMap = { image:{ label:"Image Secret", authTypes:[ { id:"kubernetes.io/dockercfg", label:"Image Registry Credentials" }, { id:"kubernetes.io/dockerconfigjson", label:"Configuration File" } ] }, source:{ label:"Source Secret", authTypes:[ { id:"kubernetes.io/basic-auth", label:"Basic Authentication" }, { id:"kubernetes.io/ssh-auth", label:"SSH Key" } ] } }, d.secretTypes = _.keys(d.secretAuthTypeMap), d.type ? d.newSecret = { type:d.type, authType:d.secretAuthTypeMap[d.type].authTypes[0].id, data:{}, linkSecret:!_.isEmpty(d.serviceAccountToLink), pickedServiceAccountToLink:d.serviceAccountToLink || "" } :d.newSecret = { type:"source", authType:"kubernetes.io/basic-auth", data:{}, linkSecret:!1, pickedServiceAccountToLink:"" }, d.add = { gitconfig:!1, cacert:!1 }, b.canI("serviceaccounts", "list") && b.canI("serviceaccounts", "update") && a.list("serviceaccounts", d, function(a) { d.serviceAccounts = a.by("metadata.name"), d.serviceAccountsNames = _.keys(d.serviceAccounts); }); var e = function(a, b) { var c = { apiVersion:"v1", kind:"Secret", metadata:{ name:d.newSecret.data.secretName }, type:b, data:{} }; switch (b) { case "kubernetes.io/basic-auth": a.passwordToken ? c.data = { password:window.btoa(a.passwordToken) } :c.type = "Opaque", a.username && (c.data.username = window.btoa(a.username)), a.gitconfig && (c.data[".gitconfig"] = window.btoa(a.gitconfig)), a.cacert && (c.data["ca.crt"] = window.btoa(a.cacert)); break; case "kubernetes.io/ssh-auth": c.data = { "ssh-privatekey":window.btoa(a.privateKey) }, a.gitconfig && (c.data[".gitconfig"] = window.btoa(a.gitconfig)); break; case "kubernetes.io/dockerconfigjson": var e = window.btoa(a.dockerConfig); JSON.parse(a.dockerConfig).auths ? c.data[".dockerconfigjson"] = e :(c.type = "kubernetes.io/dockercfg", c.data[".dockercfg"] = e); break; case "kubernetes.io/dockercfg": var f = window.btoa(a.dockerUsername + ":" + a.dockerPassword), g = {}; g[a.dockerServer] = { username:a.dockerUsername, password:a.dockerPassword, email:a.dockerMail, auth:f }, c.data[".dockercfg"] = window.btoa(JSON.stringify(g)); } return c; }, f = function(b, e) { var f = angular.copy(d.serviceAccounts[d.newSecret.pickedServiceAccountToLink]); switch (d.newSecret.type) { case "source": f.secrets.push({ name:b.metadata.name }); break; case "image": f.imagePullSecrets.push({ name:b.metadata.name }); } var g = d.serviceAccountToLink ? { errorNotification:!1 } :{}; a.update("serviceaccounts", d.newSecret.pickedServiceAccountToLink, f, d, g).then(function(a) { e.push({ name:"create", data:{ type:"success", message:"Secret " + b.metadata.name + " was created and linked with service account " + a.metadata.name + "." } }), d.postCreateAction({ newSecret:b, creationAlert:e }); }, function(a) { e.push({ name:"createAndLink", data:{ type:"error", message:"An error occurred while linking the secret with service account " + d.newSecret.pickedServiceAccountToLink + ".", details:c("getErrorDetails")(a) } }), d.postCreateAction({ newSecret:b, creationAlert:e }); }); }, g = _.debounce(function() { try { JSON.parse(d.newSecret.data.dockerConfig), d.invalidConfigFormat = !1; } catch (a) { d.invalidConfigFormat = !0; } }, 300, { leading:!0 }); d.aceChanged = g, d.create = function() { d.alerts = {}; var g = e(d.newSecret.data, d.newSecret.authType); a.create("secrets", null, g, d).then(function(a) { var c = [ { name:"create", data:{ type:"success", message:"Secret " + g.metadata.name + " was created." } } ]; d.newSecret.linkSecret && d.serviceAccountsNames.contains(d.newSecret.pickedServiceAccountToLink) && b.canI("serviceaccounts", "update") ? f(a, c) :d.postCreateAction({ newSecret:a, creationAlert:c }); }, function(a) { var b = a.data || {}; return "AlreadyExists" === b.reason ? void (d.nameTaken = !0) :void (d.alerts.create = { type:"error", message:"An error occurred while creating the secret.", details:c("getErrorDetails")(a) }); }); }; } }; } ]), angular.module("openshiftConsole").directive("timeOnlyDurationUntilNow", function() { return { restrict:"E", scope:{ timestamp:"=", omitSingle:"=?", precision:"=?" }, template:'{{timestamp | timeOnlyDurationFromTimestamps : null}}' }; }).directive("durationUntilNow", function() { return { restrict:"E", scope:{ timestamp:"=", omitSingle:"=?", precision:"=?" }, template:'{{timestamp | duration : null : omitSingle : precision}}' }; }), angular.module("openshiftConsole").directive("deleteLink", [ "$uibModal", "$location", "$filter", "$q", "hashSizeFilter", "APIService", "DataService", "AlertMessageService", "Navigate", "Logger", function(a, b, c, d, e, f, g, h, i, j) { return { restrict:"E", scope:{ kind:"@", group:"@?", typeDisplayName:"@?", resourceName:"@", projectName:"@", alerts:"=", displayName:"@", disableDelete:"=?", typeNameToConfirm:"=?", label:"@?", buttonOnly:"@", stayOnCurrentPage:"=?", replicas:"=?", hpaList:"=?", success:"=?", redirectUrl:"@?" }, templateUrl:function(a, b) { return angular.isDefined(b.buttonOnly) ? "views/directives/delete-button.html" :"views/directives/delete-link.html"; }, replace:!0, link:function(e, k, l) { "Project" === l.kind && (e.isProject = !0), e.options = { deleteHPAs:!0 }; var m = function(a) { e.stayOnCurrentPage ? e.alerts[a.name] = a.data :h.addAlert(a); }, n = function(a) { return g["delete"]({ resource:"horizontalpodautoscalers", group:"extensions" }, a.metadata.name, { namespace:e.projectName }).then(function() { m({ name:a.metadata.name, data:{ type:"success", message:"Horizontal Pod Autoscaler " + a.metadata.name + " was marked for deletion." } }); })["catch"](function(b) { m({ name:a.metadata.name, data:{ type:"error", message:"Horizontal Pod Autoscaler " + a.metadata.name + " could not be deleted." } }), j.error("HPA " + a.metadata.name + " could not be deleted.", b); }); }, o = function() { if (!e.stayOnCurrentPage) { if (e.redirectUrl) return void b.url(e.redirectUrl); if ("Project" !== e.kind) return void i.toResourceList(f.kindToResource(e.kind), e.projectName); if ("/" === b.path()) return void e.$emit("deleteProject"); var a = URI("/"); b.url(a); } }; e.openDeleteModal = function() { if (!e.disableDelete) { var b = a.open({ animation:!0, templateUrl:"views/modals/delete-resource.html", controller:"DeleteModalController", scope:e }); b.result.then(function() { var a = e.kind, b = e.resourceName, h = e.typeDisplayName || c("humanizeKind")(a), i = h + " '" + (e.displayName ? e.displayName :b) + "'", k = "Project" === e.kind ? {} :{ namespace:e.projectName }; g["delete"]({ resource:f.kindToResource(a), group:e.group }, b, k).then(function() { m({ name:b, data:{ type:"success", message:_.capitalize(i) + " was marked for deletion." } }), e.success && e.success(); var a = []; e.options.deleteHPAs && _.forEach(e.hpaList, function(b) { a.push(n(b)); }), a.length ? d.all(a).then(o) :o(); })["catch"](function(a) { e.alerts[b] = { type:"error", message:_.capitalize(i) + "' could not be deleted.", details:c("getErrorDetails")(a) }, j.error(i + " could not be deleted.", a); }); }); } }; } }; } ]), angular.module("openshiftConsole").directive("editWebhookTriggers", [ "ApplicationGenerator", function(a) { return { restrict:"E", scope:{ type:"@", typeInfo:"@", triggers:"=", bcName:"=", projectName:"=", form:"=" }, templateUrl:"views/directives/edit-webhook-triggers.html", controller:[ "$scope", function(b) { b.addWebhookTrigger = function(c) { var d = { disabled:!1, data:{ type:c } }; d.data["GitHub" === c ? "github" :"generic"] = { secret:a._generateSecret() }, b.triggers.push(d), b.form.$setDirty(); }; } ] }; } ]), angular.module("openshiftConsole").directive("editConfigMap", function() { return { require:"^form", restrict:"E", scope:{ configMap:"=model", showNameInput:"=" }, templateUrl:"views/directives/edit-config-map.html", link:function(a, b, c, d) { a.form = d, a.addItem = function() { a.data.push({ key:"", value:"" }), a.form.$setDirty(); }, a.removeItem = function(b) { a.data.splice(b, 1), a.form.$setDirty(); }, a.getKeys = function() { return _.map(a.data, "key"); }; var e = a.$watch("configMap.data", function(b) { b && (a.data = _.map(b, function(a, b) { return { key:b, value:a }; }), _.sortBy(a.data, "key"), _.isEmpty(a.data) && a.addItem(), e(), a.$watch("data", function(b) { var c = {}; _.each(b, function(a) { c[a.key] = a.value; }), _.set(a, "configMap.data", c); }, !0)); }); } }; }), angular.module("openshiftConsole").directive("events", [ "$routeParams", "$filter", "DataService", "KeywordService", "ProjectsService", "Logger", function(a, b, c, d, e, f) { return { restrict:"E", scope:{ resourceKind:"@?", resourceName:"@?", projectContext:"=" }, templateUrl:"views/directives/events.html", controller:[ "$scope", function(a) { a.filter = { text:"" }; var b = function(b) { return a.resourceKind ? _.filter(b, function(b) { return b.involvedObject.kind === a.resourceKind && b.involvedObject.name === a.resourceName; }) :b; }, e = [], g = _.get(a, "sortConfig.currentField.id"), h = { lastTimestamp:!0 }, i = function() { var b = _.get(a, "sortConfig.currentField.id", "lastTimestamp"); g !== b && (g = b, a.sortConfig.isAscending = !h[g]); var c = a.sortConfig.isAscending ? "asc" :"desc"; e = _.sortByOrder(a.events, [ b ], [ c ]); }, j = [], k = function() { a.filterExpressions = j = d.generateKeywords(_.get(a, "filter.text")); }, l = [ "reason", "message", "type" ]; a.resourceKind && a.resourceName || l.splice(0, 0, "involvedObject.name", "involvedObject.kind"); var m = function() { a.filteredEvents = d.filterForKeywords(e, l, j); }; a.$watch("filter.text", _.debounce(function() { k(), a.$apply(m); }, 50, { maxWait:250 })); var n = function() { i(), m(); }, o = _.debounce(function() { a.$evalAsync(n); }, 250, { leading:!0, trailing:!1, maxWait:1e3 }); a.sortConfig = { fields:[ { id:"lastTimestamp", title:"Time", sortType:"alpha" }, { id:"type", title:"Severity", sortType:"alpha" }, { id:"reason", title:"Reason", sortType:"alpha" }, { id:"message", title:"Message", sortType:"alpha" }, { id:"count", title:"Count", sortType:"numeric" } ], isAscending:!0, onSortChange:n }, a.resourceKind && a.resourceName || a.sortConfig.fields.splice(1, 0, { id:"involvedObject.name", title:"Name", sortType:"alpha" }, { id:"involvedObject.kind", title:"Kind", sortType:"alpha" }); var p = []; p.push(c.watch("events", a.projectContext, function(c) { a.events = b(c.by("metadata.name")), o(), f.log("events (subscribe)", a.filteredEvents); })), a.$on("$destroy", function() { c.unwatchAll(p); }); } ] }; } ]), angular.module("openshiftConsole").directive("eventsSidebar", [ "DataService", "Logger", "$rootScope", function(a, b, c) { return { restrict:"E", scope:{ projectContext:"=", collapsed:"=" }, templateUrl:"views/directives/events-sidebar.html", controller:[ "$scope", function(d) { var e = []; e.push(a.watch("events", d.projectContext, function(a) { var c = a.by("metadata.name"); d.events = _.sortByOrder(c, [ "lastTimestamp" ], [ "desc" ]), d.warningCount = _.size(_.filter(c, { type:"Warning" })), b.log("events (subscribe)", d.events); })), d.highlightedEvents = {}, d.collapseSidebar = function() { d.collapsed = !0; }, c.$on("event.resource.highlight", function(a, b) { var c = _.get(b, "kind"), e = _.get(b, "metadata.name"); c && e && _.each(d.events, function(a) { a.involvedObject.kind === c && a.involvedObject.name === e && (d.highlightedEvents[c + "/" + e] = !0); }); }), c.$on("event.resource.clear-highlight", function(a, b) { var c = _.get(b, "kind"), e = _.get(b, "metadata.name"); c && e && _.each(d.events, function(a) { a.involvedObject.kind === c && a.involvedObject.name === e && (d.highlightedEvents[c + "/" + e] = !1); }); }), d.$on("$destroy", function() { a.unwatchAll(e); }); } ] }; } ]), angular.module("openshiftConsole").directive("eventsBadge", [ "$filter", "DataService", "Logger", function(a, b, c) { return { restrict:"E", scope:{ projectContext:"=", sidebarCollapsed:"=" }, templateUrl:"views/directives/events-badge.html", controller:[ "$scope", function(d) { var e = [], f = a("orderObjectsByDate"); e.push(b.watch("events", d.projectContext, function(a) { var b = a.by("metadata.name"); d.events = f(b, !0), d.warningCount = _.size(_.filter(b, { type:"Warning" })), d.normalCount = _.size(_.filter(b, { type:"Normal" })), c.log("events (subscribe)", d.events); })), d.expandSidebar = function() { d.sidebarCollapsed = !1; }, d.$on("$destroy", function() { b.unwatchAll(e); }); } ] }; } ]), angular.module("openshiftConsole").directive("fromFile", [ "$q", "$uibModal", "$location", "$filter", "CachedTemplateService", "AlertMessageService", "Navigate", "TaskList", "DataService", "APIService", "QuotaService", function(a, b, c, d, e, f, g, h, i, j, k) { return { restrict:"E", scope:!1, templateUrl:"views/directives/from-file.html", controller:[ "$scope", function(l) { function m(a) { return !!a.kind || (l.error = { message:"Resource is missing kind field." }, !1); } function n(a) { return !!l.isList || (a.metadata ? a.metadata.name ? !a.metadata.namespace || a.metadata.namespace === l.projectName || (l.error = { message:a.kind + " " + a.metadata.name + " can't be created in project " + a.metadata.namespace + ". Can't create resource in different projects." }, !1) :(l.error = { message:"Resource name is missing in metadata field." }, !1) :(l.error = { message:"Resource is missing metadata field." }, !1)); } function o() { var a = b.open({ animation:!0, templateUrl:"views/modals/process-template.html", controller:"ProcessTemplateModalController", scope:l }); a.result.then(function() { l.templateOptions.add ? q() :(e.setTemplate(l.resourceList[0]), r()); }); } function p() { var a = b.open({ animation:!0, templateUrl:"views/modals/confirm-replace.html", controller:"ConfirmReplaceModalController", scope:l }); a.result.then(function() { k.getLatestQuotaAlerts(l.createResources, l.context).then(C); }); } function q() { var b = l.createResources.length, c = l.updateResources.length; if (l.resourceKind.endsWith("List")) { var d = []; c > 0 && d.push(v()), b > 0 && d.push(u()), a.all(d).then(r); } else t(); } function r() { var a; if ("Template" === l.resourceKind && l.templateOptions.process && !l.errorOccured) { var b = l.templateOptions.add || l.updateResources.length > 0 ? l.projectName :""; a = g.createFromTemplateURL(A, l.projectName, { namespace:b }); } else a = g.projectOverviewURL(l.projectName); c.url(a); } function s(a) { var b = j.objectToResourceGroupVersion(a); return b ? j.apiInfo(b) ? i.get(b, a.metadata.name, l.context, { errorNotification:!1 }).then(function(b) { var c = angular.copy(a), d = angular.copy(b.metadata); d.annotations = a.metadata.annotations, d.labels = a.metadata.labels, c.metadata = d, l.updateResources.push(c); }, function() { l.createResources.push(a); }) :(l.errorOccured = !0, void (l.error = { message:j.unsupportedObjectKindOrVersion(a) })) :(l.errorOccured = !0, void (l.error = { message:j.invalidObjectKindOrVersion(a) })); } function t() { var a; _.isEmpty(l.createResources) ? (a = _.head(l.updateResources), i.update(j.kindToResource(a.kind), a.metadata.name, a, { namespace:l.projectName }).then(function() { f.addAlert({ name:a.metadata.name, data:{ type:"success", message:a.kind + " " + a.metadata.name + " was successfully updated." } }), r(); }, function(b) { l.alerts["update" + a.metadata.name] = { type:"error", message:"Unable to update the " + x(a.kind) + " '" + a.metadata.name + "'.", details:d("getErrorDetails")(b) }; })) :(a = _.head(l.createResources), i.create(j.kindToResource(a.kind), null, a, { namespace:l.projectName }).then(function() { f.addAlert({ name:a.metadata.name, data:{ type:"success", message:a.kind + " " + a.metadata.name + " was successfully created." } }), r(); }, function(b) { l.alerts["create" + a.metadata.name] = { type:"error", message:"Unable to create the " + x(a.kind) + " '" + a.metadata.name + "'.", details:d("getErrorDetails")(b) }; })); } function u() { var b = { started:"Creating resources in project " + l.projectName, success:"Creating resources in project " + l.projectName, failure:"Failed to create some resources in project " + l.projectName }, c = {}; h.add(b, c, l.projectName, function() { var b = a.defer(); return i.batch(l.createResources, l.context, "create").then(function(a) { var c = [], d = !1; if (a.failure.length > 0) d = !0, l.errorOccured = !0, a.failure.forEach(function(a) { c.push({ type:"error", message:"Cannot create " + x(a.object.kind) + ' "' + a.object.metadata.name + '". ', details:a.data.message }); }), a.success.forEach(function(a) { c.push({ type:"success", message:"Created " + x(a.kind) + ' "' + a.metadata.name + '" successfully. ' }); }); else { var e; e = l.isList ? "All items in list were created successfully." :x(l.resourceKind) + " " + l.resourceName + " was successfully created.", c.push({ type:"success", message:e }); } b.resolve({ alerts:c, hasErrors:d }); }), b.promise; }); } function v() { var b = { started:"Updating resources in project " + l.projectName, success:"Updated resources in project " + l.projectName, failure:"Failed to update some resources in project " + l.projectName }, c = {}; h.add(b, c, l.projectName, function() { var b = a.defer(); return i.batch(l.updateResources, l.context, "update").then(function(a) { var c = [], d = !1; if (a.failure.length > 0) d = !0, l.errorOccured = !0, a.failure.forEach(function(a) { c.push({ type:"error", message:"Cannot update " + x(a.object.kind) + ' "' + a.object.metadata.name + '". ', details:a.data.message }); }), a.success.forEach(function(a) { c.push({ type:"success", message:"Updated " + x(a.kind) + ' "' + a.metadata.name + '" successfully. ' }); }); else { var e; e = l.isList ? "All items in list were updated successfully." :x(l.resourceKind) + " " + l.resourceName + " was successfully updated.", c.push({ type:"success", message:e }); } b.resolve({ alerts:c, hasErrors:d }); }, function(a) { var c = []; c.push({ type:"error", message:"An error occurred updating the resources.", details:"Status: " + a.status + ". " + a.data }), b.resolve({ alerts:c }); }), b.promise; }); } var w, x = d("humanizeKind"); h.clear(), l.aceLoaded = function(a) { w = a.getSession(), w.setOption("tabSize", 2), w.setOption("useSoftTabs", !0), a.setDragDelay = 0, a.$blockScrolling = 1 / 0; }; var y = function() { var a = w.getAnnotations(); l.editorErrorAnnotation = _.some(a, { type:"error" }); }, z = _.debounce(function() { try { JSON.parse(l.editorContent), w.setMode("ace/mode/json"); } catch (a) { try { jsyaml.safeLoad(l.editorContent), w.setMode("ace/mode/yaml"); } catch (a) {} } l.$apply(y); }, 300); l.aceChanged = z; var A, B = function(a) { var c = b.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { alerts:a, message:"Problems were detected while checking your application configuration.", okButtonText:"Create Anyway", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }; } } }); c.result.then(q); }, C = function(a) { var b = a.quotaAlerts || [], c = _.filter(b, { type:"error" }); c.length ? (l.disableInputs = !1, l.alerts = b) :b.length ? (B(b), l.disableInputs = !1) :q(); }; l.create = function() { l.alerts = {}, delete l.error; try { A = JSON.parse(l.editorContent); } catch (b) { try { A = jsyaml.safeLoad(l.editorContent); } catch (b) { return void (l.error = b); } } if (m(A) && (l.resourceKind = A.kind, l.resourceKind.endsWith("List") ? l.isList = !0 :l.isList = !1, n(A))) { l.isList ? (l.resourceList = A.items, l.resourceName = "") :(l.resourceList = [ A ], l.resourceName = A.metadata.name, "Template" === l.resourceKind && (l.templateOptions = { process:!0, add:!1 })), l.updateResources = [], l.createResources = []; var c = []; l.errorOccured = !1, _.forEach(l.resourceList, function(a) { return n(a) ? void c.push(s(a)) :(l.errorOccured = !0, !1); }), a.all(c).then(function() { l.errorOccured || (1 === l.createResources.length && "Template" === l.resourceList[0].kind ? o() :_.isEmpty(l.updateResources) ? k.getLatestQuotaAlerts(l.createResources, l.context).then(C) :(l.updateTemplate = 1 === l.updateResources.length && "Template" === l.updateResources[0].kind, l.updateTemplate ? o() :p())); }); } }; } ] }; } ]), angular.module("openshiftConsole").directive("oscFileInput", [ "Logger", function(a) { return { restrict:"E", scope:{ model:"=", required:"=", disabled:"=ngDisabled", showTextArea:"=", helpText:"@?", dropZoneId:"@?" }, templateUrl:"views/directives/osc-file-input.html", link:function(b, c) { function d() { var a = c.find(".drag-and-drop-zone"); a.on("dragover", function() { b.disabled || (a.addClass("highlight-drag-and-drop-zone"), i = !0); }), c.find(".drag-and-drop-zone p").on("dragover", function() { b.disabled || (i = !0); }), a.on("dragleave", function() { b.disabled || (i = !1, _.delay(function() { i || a.removeClass("highlight-drag-and-drop-zone"); }, 200)); }), a.on("drop", function(a) { if (!b.disabled) { var c = _.get(a, "originalEvent.dataTransfer.files", []); return c.length > 0 && (b.file = _.head(c), e(b.file)), f(), $(".drag-and-drop-zone").trigger("putDropZoneFront", !1), $(".drag-and-drop-zone").trigger("reset"), !1; } }); var d = function(a, b) { var c = b.offset(), d = b.outerWidth(), e = b.outerHeight(); a.css({ height:e + 6, width:d + 6, top:c.top, left:c.left, position:"fixed", "z-index":100 }); }; a.on("putDropZoneFront", function(a, e) { if (!b.disabled) { var f, g = c.find(".drag-and-drop-zone"); return e ? (f = b.dropZoneId ? $("#" + b.dropZoneId) :c, d(g, f)) :g.css("z-index", "-1"), !1; } }), a.on("reset", function() { if (!b.disabled) return j = !1, !1; }); } function e(c) { var d = new FileReader(); d.onloadend = function() { b.$apply(function() { b.fileName = c.name, b.model = d.result; }); }, d.onerror = function(c) { b.supportsFileUpload = !1, b.uploadError = !0, a.error("Could not read file", c); }, d.readAsText(c); } function f() { c.find(".drag-and-drop-zone").removeClass("show-drag-and-drop-zone highlight-drag-and-drop-zone"); } var g = _.uniqueId("osc-file-input-"); b.dropMessageID = g + "-drop-message", b.helpID = g + "-help", b.supportsFileUpload = window.File && window.FileReader && window.FileList && window.Blob, b.uploadError = !1; var h = "#" + b.dropMessageID, i = !1, j = !1, k = c.find("input[type=file]"); setTimeout(d), $(document).on("drop." + g, function() { return f(), c.find(".drag-and-drop-zone").trigger("putDropZoneFront", !1), !1; }), $(document).on("dragenter." + g, function() { if (!b.disabled) return j = !0, c.find(".drag-and-drop-zone").addClass("show-drag-and-drop-zone"), c.find(".drag-and-drop-zone").trigger("putDropZoneFront", !0), !1; }), $(document).on("dragover." + g, function() { if (!b.disabled) return j = !0, c.find(".drag-and-drop-zone").addClass("show-drag-and-drop-zone"), !1; }), $(document).on("dragleave." + g, function() { return j = !1, _.delay(function() { j || c.find(".drag-and-drop-zone").removeClass("show-drag-and-drop-zone"); }, 200), !1; }), b.cleanInputValues = function() { b.model = "", b.fileName = "", k[0].value = ""; }, k.change(function() { e(k[0].files[0]); }), b.$on("$destroy", function() { $(h).off(), $(document).off("drop." + g).off("dragenter." + g).off("dragover." + g).off("dragleave." + g); }); } }; } ]), angular.module("openshiftConsole").directive("oscFormSection", function() { return { restrict:"E", transclude:!0, scope:{ header:"@", about:"@", aboutTitle:"@", editText:"@", expand:"=?", canToggle:"=?" }, templateUrl:"views/directives/osc-form-section.html", link:function(a, b, c) { c.editText || (c.editText = "Edit"), angular.isDefined(c.canToggle) || (a.canToggle = !0), a.toggle = function() { a.expand = !a.expand; }; } }; }), angular.module("openshiftConsole").directive("oscGitLink", [ "$filter", function(a) { return { restrict:"E", scope:{ uri:"=", ref:"=", contextDir:"=" }, transclude:!0, link:function(b) { var c = a("isAbsoluteURL"), d = a("githubLink"); b.$watchGroup([ "uri", "ref", "contextDir" ], function() { b.gitLink = d(b.uri, b.ref, b.contextDir), b.isLink = c(b.gitLink); }); }, template:'' }; } ]), angular.module("openshiftConsole").directive("oscImageSummary", function() { return { restrict:"E", scope:{ resource:"=", name:"=", tag:"=" }, templateUrl:"views/directives/osc-image-summary.html" }; }), angular.module("openshiftConsole").controller("KeyValuesEntryController", [ "$scope", function(a) { a.editing = !1, a.edit = function() { a.originalValue = a.value, a.editing = !0; }, a.cancel = function() { a.value = a.originalValue, a.editing = !1; }, a.update = function(b, c, d) { c && (d[b] = c, a.editing = !1); }; } ]).directive("oscInputValidator", function() { var a = { always:function(a, b) { return !0; }, env:function(a, b) { var c = /^[A-Za-z_][A-Za-z0-9_]*$/i; return void 0 === a || null === a || 0 === a.trim().length || c.test(b); }, label:function(a, b) { function c(a) { return !(a.length > h) && g.test(a); } function d(a) { return !(a.length > f) && e.test(a); } var e = /^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$/, f = 63, g = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/, h = 253; if (void 0 === a || null === a || 0 === a.trim().length) return !0; var i = b.split("/"); switch (i.length) { case 1: return d(i[0]); case 2: return c(i[0]) && d(i[1]); } return !1; }, path:function(a, b) { var c = /^\//; return void 0 === a || null === a || 0 === a.trim().length || c.test(b); } }; return { require:[ "ngModel", "^oscKeyValues" ], restrict:"A", link:function(b, c, d, e) { var f = e[0], g = e[1]; "key" === d.oscInputValidator ? f.$validators.oscKeyValid = a[g.scope.keyValidator] :"value" === d.oscInputValidator && (f.$validators.oscValueValid = a[g.scope.valueValidator]); } }; }).directive("oscKeyValues", function() { return { restrict:"E", scope:{ keyTitle:"@", valueTitle:"@", entries:"=", delimiter:"@", editable:"@", keyValidator:"@", valueValidator:"@", deletePolicy:"@", readonlyKeys:"@", keyValidationTooltip:"@", valueValidationTooltip:"@", preventEmpty:"=?" }, controller:[ "$scope", function(a) { var b, c = {}, d = function() { return !!a.key || !!a.value; }, e = function() { d() ? a.showCommmitWarning = !0 :a.showCommmitWarning = !1; }, f = _.debounce(function() { a.$applyAsync(function() { a.key ? a.clean.isClean.$setValidity("isClean", !1) :a.value ? a.clean.isClean.$setValidity("isClean", !1) :a.clean.isClean.$setValidity("isClean", !0); }); }, 200), g = function(b) { return function(c) { a.$applyAsync(function() { _.includes(b, document.activeElement) || (e(), f()); }); }; }; a.isClean = f, a.clear = function() { a.key = "", a.value = "", e(), f(); }, a.allowDelete = function(b) { return (!a.preventEmpty || 1 !== Object.keys(a.entries).length) && ("never" !== a.deletePolicy && ("added" !== a.deletePolicy || void 0 !== c[b])); }, a.addEntry = function() { if (a.key && a.value) { var d = a.readonlyKeys.split(","); if (d.indexOf(a.key) !== -1) return; c[a.key] = "", a.entries[a.key] = a.value, a.key = null, a.value = null, a.form.$setPristine(), a.form.$setUntouched(), e(), f(), b.focus(); } }, a.deleteEntry = function(b) { a.entries[b] && (delete a.entries[b], delete c[b], a.form.$setDirty()); }, a.setErrorText = function(a) { return "path" === a ? "absolute path" :"label" === a ? "label" :"key"; }, this.scope = a, this.init = function(c, d, e) { var f = [ c[0], d[0], e[0] ], h = g(f); b = c, c.on("blur", h), d.on("blur", h), e.on("blur", h), a.$on("$destroy", function() { c.off("blur", h), d.off("blur", h), e.off("blur", h); }); }; } ], templateUrl:"views/directives/osc-key-values.html", compile:function(a, b) { return b.delimiter || (b.delimiter = ":"), b.keyTitle || (b.keyTitle = "Name"), b.valueTitle || (b.valueTitle = "Value"), b.editable && "true" !== b.editable ? b.editable = !1 :b.editable = !0, b.keyValidator || (b.keyValidator = "always"), b.valueValidator || (b.valueValidator = "always"), [ "always", "added", "none" ].indexOf(b.deletePolicy) === -1 && (b.deletePolicy = "always"), b.readonlyKeys || (b.readonlyKeys = ""), { post:function(a, b, c, d) { d.init(b.find('input[name="key"]'), b.find('input[name="value"]'), b.find("a.add-key-value")); } }; } }; }), angular.module("openshiftConsole").directive("oscRouting", [ "Constants", function(a) { return { require:"^form", restrict:"E", scope:{ route:"=model", services:"=", showNameInput:"=", routingDisabled:"=", hostReadOnly:"=" }, templateUrl:"views/directives/osc-routing.html", link:function(b, c, d, e) { b.form = e, b.controls = {}, b.options = { secureRoute:!1, alternateServices:!1 }, b.disableWildcards = a.DISABLE_WILDCARD_ROUTES, b.disableCertificateInputs = function() { var a = _.get(b, "route.tls.termination"); return !a || "passthrough" === a; }, b.insecureTrafficOptions = [ { value:"", label:"None" }, { value:"Allow", label:"Allow" }, { value:"Redirect", label:"Redirect" } ], _.has(b, "route.tls.insecureEdgeTerminationPolicy") || _.set(b, "route.tls.insecureEdgeTerminationPolicy", ""), b.disableWildcards ? b.hostnamePattern = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/ :b.hostnamePattern = /^(\*(\.[a-z0-9]([-a-z0-9]*[a-z0-9]))+|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)$/; var f = function(a) { a && (b.unnamedServicePort = 1 === a.spec.ports.length && !a.spec.ports[0].name, a.spec.ports.length && !b.unnamedServicePort ? b.route.portOptions = _.map(a.spec.ports, function(a) { return { port:a.name, label:a.port + " → " + a.targetPort + " (" + a.protocol + ")" }; }) :b.route.portOptions = []); }; b.services && !b.route.service && (b.route.service = _.find(b.services)), b.$watch("route.to.service", function(a, c) { f(a), a === c && b.route.targetPort || (b.route.targetPort = _.get(b, "route.portOptions[0].port")), b.services && (b.alternateServiceOptions = _.reject(b.services, function(b) { return a === b; })); }), b.$watch("route.alternateServices", function(a) { b.duplicateServices = _(a).map("service").filter(function(a, b, c) { return _.includes(c, a, b + 1); }).value(), e.$setValidity("duplicateServices", !b.duplicateServices.length), b.options.alternateServices = !_.isEmpty(a); }, !0); var g = function() { return !!b.route.tls && ((!b.route.tls.termination || "passthrough" === b.route.tls.termination) && (b.route.tls.certificate || b.route.tls.key || b.route.tls.caCertificate || b.route.tls.destinationCACertificate)); }; b.$watch("route.tls.termination", function() { b.options.secureRoute = !!_.get(b, "route.tls.termination"), b.showCertificatesNotUsedWarning = g(); }); var h; b.$watch("options.secureRoute", function(a, c) { if (a !== c) { var d = _.get(b, "route.tls.termination"); !b.securetRoute && d && (h = d, delete b.route.tls.termination), b.options.secureRoute && !d && _.set(b, "route.tls.termination", h || "edge"); } }), b.$watch("options.alternateServices", function(a, c) { a !== c && (a || (b.route.alternateServices = []), a && _.isEmpty(b.route.alternateServices) && b.addAlternateService()); }), b.addAlternateService = function() { b.route.alternateServices = b.route.alternateServices || []; var a = _.find(b.services, function(a) { return a !== b.route.to.service && !_.some(b.route.alternateServices, { service:a }); }); _.has(b, "route.to.weight") || _.set(b, "route.to.weight", 1), b.route.alternateServices.push({ service:a, weight:1 }); }, b.weightAsPercentage = function(a, c) { a = a || 0; var d = _.get(b, "route.to.weight", 0); if (_.each(b.route.alternateServices, function(a) { d += _.get(a, "weight", 0); }), !d) return ""; var e = a / d * 100; return c ? d3.round(e, 1) + "%" :e; }; var i = !1; b.$watch("route.alternateServices.length", function(a) { 0 === a && _.has(b, "route.to.weight") && delete b.route.to.weight, 1 === a && (i = !0, b.controls.rangeSlider = b.weightAsPercentage(b.route.to.weight)); }), b.$watch("controls.rangeSlider", function(a, c) { return i ? void (i = !1) :void (a !== c && (a = parseInt(a, 10), _.set(b, "route.to.weight", a), _.set(b, "route.alternateServices[0].weight", 100 - a))); }); } }; } ]).directive("oscRoutingService", function() { return { restrict:"E", scope:{ model:"=", services:"=", isAlternate:"=?", showWeight:"=?" }, templateUrl:"views/directives/osc-routing-service.html", link:function(a, b, c, d) { a.form = d, a.id = _.uniqueId("osc-routing-service-"), a.$watchGroup([ "model.service", "services" ], function() { if (!_.isEmpty(a.services)) { var b = _.get(a, "model.service"); if (!b || !_.includes(a.services, b)) { var c = _.find(a.services); _.set(a, "model.service", c); } } }); } }; }), angular.module("openshiftConsole").directive("oscPersistentVolumeClaim", [ "DataService", function(a) { return { restrict:"E", scope:{ claim:"=model" }, templateUrl:"views/directives/osc-persistent-volume-claim.html", link:function(b) { b.storageClasses = [], b.claim.unit = "Mi", b.units = [ { value:"Mi", label:"MiB" }, { value:"Gi", label:"GiB" }, { value:"Ti", label:"TiB" }, { value:"Pi", label:"PiB" } ], b.claim.selectedLabels = [], a.list({ group:"storage.k8s.io", resource:"storageclasses" }, {}, function(a) { b.storageClasses = a.by("metadata.name"); }, { errorNotification:!1 }); } }; } ]), angular.module("openshiftConsole").directive("oscUnique", function() { return { restrict:"A", scope:{ oscUnique:"=" }, require:"ngModel", link:function(a, b, c, d) { var e = []; a.$watchCollection("oscUnique", function(a) { e = _.isArray(a) ? a :_.keys(a); }), d.$parsers.unshift(function(a) { return d.$setValidity("oscUnique", !_.includes(e, a)), a; }); } }; }), angular.module("openshiftConsole").directive("oscAutoscaling", [ "HPAService", "LimitRangesService", function(a, b) { return { restrict:"E", scope:{ autoscaling:"=model", project:"=", showNameInput:"=?", nameReadOnly:"=?" }, templateUrl:"views/directives/osc-autoscaling.html", link:function(c) { c.$watch("project", function() { if (c.project) { c.isRequestCalculated = b.isRequestCalculated("cpu", c.project); var d = window.OPENSHIFT_CONSTANTS.DEFAULT_HPA_CPU_TARGET_PERCENT; c.isRequestCalculated && (d = a.convertLimitPercentToRequest(d, c.project)), _.set(c, "autoscaling.defaultTargetCPU", d), c.defaultTargetCPUDisplayValue = window.OPENSHIFT_CONSTANTS.DEFAULT_HPA_CPU_TARGET_PERCENT; var e = !1, f = function(b) { return e ? void (e = !1) :(b && c.isRequestCalculated && (b = a.convertRequestPercentToLimit(b, c.project)), void _.set(c, "targetCPUInput.percent", b)); }; c.$watch("autoscaling.targetCPU", f); var g = function(b) { b && c.isRequestCalculated && (b = a.convertLimitPercentToRequest(b, c.project)), e = !0, _.set(c, "autoscaling.targetCPU", b); }; c.$watch("targetCPUInput.percent", function(a, b) { a !== b && g(a); }); } }); } }; } ]), angular.module("openshiftConsole").directive("oscSecrets", [ "$uibModal", "$filter", "DataService", "SecretsService", function(a, b, c, d) { return { restrict:"E", scope:{ pickedSecrets:"=model", secretsByType:"=", namespace:"=", displayType:"@", type:"@", alerts:"=", disableInput:"=", serviceAccountToLink:"@?", allowMultipleSecrets:"=?" }, templateUrl:"views/directives/osc-secrets.html", link:function(b) { b.canAddSourceSecret = function() { if (!b.allowMultipleSecrets) return !1; var a = _.last(b.pickedSecrets); return !!a && a.name; }, b.setLastSecretsName = function(a) { var c = _.last(b.pickedSecrets); c.name = a; }, b.addSourceSecret = function() { b.pickedSecrets.push({ name:"" }); }, b.removeSecret = function(a) { 1 === b.pickedSecrets.length ? b.pickedSecrets = [ { name:"" } ] :b.pickedSecrets.splice(a, 1), b.secretsForm.$setDirty(); }, b.openCreateSecretModal = function() { b.newSecret = {}; var e = a.open({ animation:!0, backdrop:"static", templateUrl:"views/modals/create-secret.html", controller:"CreateSecretModalController", scope:b }); e.result.then(function(a) { c.list("secrets", { namespace:b.namespace }, function(c) { var e = d.groupSecretsByType(c), f = _.mapValues(e, function(a) { return _.map(a, "metadata.name"); }); b.secretsByType = _.each(f, function(a) { a.unshift(""); }), b.setLastSecretsName(a.metadata.name), b.secretsForm.$setDirty(); }); }); }; } }; } ]), angular.module("openshiftConsole").directive("oscSourceSecrets", [ "$uibModal", "$filter", "DataService", "SecretsService", function(a, b, c, d) { return { restrict:"E", scope:{ pickedSecrets:"=model", secretsByType:"=", strategyType:"=", type:"@", displayType:"@", namespace:"=", alerts:"=", serviceAccountToLink:"@?" }, templateUrl:"views/directives/osc-source-secrets.html", link:function(b) { b.canAddSourceSecret = function() { var a = _.last(b.pickedSecrets); switch (b.strategyType) { case "Custom": return a.secretSource.name; default: return a.secret.name; } }, b.setLastSecretsName = function(a) { var c = _.last(b.pickedSecrets); switch (b.strategyType) { case "Custom": return void (c.secretSource.name = a); default: return void (c.secret.name = a); } }, b.addSourceSecret = function() { switch (b.strategyType) { case "Custom": return void b.pickedSecrets.push({ secretSource:{ name:"" }, mountPath:"" }); default: return void b.pickedSecrets.push({ secret:{ name:"" }, destinationDir:"" }); } }, b.removeSecret = function(a) { if (1 === b.pickedSecrets.length) switch (b.strategyType) { case "Custom": b.pickedSecrets = [ { secretSource:{ name:"" }, mountPath:"" } ]; break; default: b.pickedSecrets = [ { secret:{ name:"" }, destinationDir:"" } ]; } else b.pickedSecrets.splice(a, 1); b.secretsForm.$setDirty(); }, b.openCreateSecretModal = function() { var e = a.open({ animation:!0, templateUrl:"views/modals/create-secret.html", controller:"CreateSecretModalController", scope:b }); e.result.then(function(a) { c.list("secrets", { namespace:b.namespace }, function(c) { var e = d.groupSecretsByType(c), f = _.mapValues(e, function(a) { return _.map(a, "metadata.name"); }); b.secretsByType = _.each(f, function(a) { a.unshift(""); }), b.setLastSecretsName(a.metadata.name); }); }); }; } }; } ]), angular.module("openshiftConsole").directive("replicas", function() { return { restrict:"E", scope:{ status:"=?", spec:"=", disableScaling:"=?", scaleFn:"&?", deployment:"=" }, templateUrl:"views/directives/replicas.html", link:function(a) { a.model = { editing:!1 }, a.scale = function() { a.form.scaling.$valid && (a.scaleFn({ replicas:a.model.desired }), a.model.editing = !1); }, a.cancel = function() { a.model.editing = !1; }; } }; }), angular.module("openshiftConsole").directive("overviewMonopod", [ "Navigate", "$location", function(a, b) { return { restrict:"E", scope:{ pod:"=" }, templateUrl:"views/_overview-monopod.html", link:function(c) { c.viewPod = function() { var d = a.resourceURL(c.pod, "Pod", c.pod.metadata.namespace); b.url(d); }; } }; } ]).directive("podTemplate", function() { return { restrict:"E", scope:{ podTemplate:"=", imagesByDockerReference:"=", builds:"=", detailed:"=?", addHealthCheckUrl:"@?" }, templateUrl:"views/_pod-template.html" }; }).directive("triggers", function() { return { restrict:"E", scope:{ triggers:"=", buildsByOutputImage:"=", namespace:"=" }, templateUrl:"views/_triggers.html" }; }).directive("deploymentConfigMetadata", function() { return { restrict:"E", scope:{ deploymentConfigId:"=", exists:"=", differentService:"=" }, templateUrl:"views/_deployment-config-metadata.html" }; }).directive("annotations", function() { return { restrict:"E", scope:{ annotations:"=" }, templateUrl:"views/directives/annotations.html", link:function(a) { a.expandAnnotations = !1, a.toggleAnnotations = function() { a.expandAnnotations = !a.expandAnnotations; }; } }; }).directive("volumes", function() { return { restrict:"E", scope:{ volumes:"=", namespace:"=", canRemove:"=?", removeFn:"&?" }, templateUrl:"views/_volumes.html" }; }).directive("environment", function() { return { restrict:"E", scope:{ envVars:"=" }, templateUrl:"views/directives/environment.html", controller:[ "$scope", function(a) { a.expanded = {}; } ] }; }).directive("hpa", function() { return { restrict:"E", scope:{ hpa:"=", project:"=", showScaleTarget:"=?", alerts:"=" }, templateUrl:"views/directives/hpa.html" }; }).directive("probe", function() { return { restrict:"E", scope:{ probe:"=" }, templateUrl:"views/directives/_probe.html" }; }).directive("podsTable", function() { return { restrict:"E", scope:{ pods:"=", activePods:"=?", emptyMessage:"=?", customNameHeader:"=?", podFailureReasons:"=?" }, templateUrl:"views/directives/pods-table.html" }; }).directive("trafficTable", function() { return { restrict:"E", scope:{ routes:"=", services:"=", portsByRoute:"=", showNodePorts:"=?", emptyMessage:"=?", customNameHeader:"=?" }, templateUrl:"views/directives/traffic-table.html" }; }), angular.module("openshiftConsole").directive("topologyDeployment", function() { return { restrict:"E", scope:{ rc:"=", deploymentConfigId:"=", deploymentConfigMissing:"=", deploymentConfigDifferentService:"=", deploymentConfig:"=", scalable:"=", hpa:"=?", limitRanges:"=", project:"=", imagesByDockerReference:"=", builds:"=", pods:"=", alerts:"=" }, templateUrl:"views/_overview-deployment.html" }; }), angular.module("openshiftConsole").directive("sidebar", [ "$location", "$filter", "Constants", function(a, b, c) { var d = b("canI"), e = function(a, b) { return a.href === b || _.some(a.prefixes, function(a) { return _.startsWith(b, a); }); }; return { restrict:"E", templateUrl:"views/_sidebar.html", controller:[ "$scope", function(f) { var g = a.path().replace("/project/" + f.projectName, ""); f.activeSecondary, f.navItems = c.PROJECT_NAVIGATION, f.activePrimary = _.find(f.navItems, function(a) { return e(a, g) ? (f.activeSecondary = null, !0) :_.some(a.secondaryNavSections, function(a) { var b = _.find(a.items, function(a) { return e(a, g); }); return !!b && (f.activeSecondary = b, !0); }); }), f.navURL = function(a) { return a ? b("isAbsoluteURL")(a) ? a :"project/" + f.projectName + a :""; }, f.show = function(a) { var b = !a.isValid || a.isValid(); if (!b) return !1; var c = !a.canI || d(a.canI.resource, a.canI.verb, a.canI.group); return c; }; } ] }; } ]).directive("projectHeader", [ "$timeout", "$location", "$filter", "DataService", "projectOverviewURLFilter", function(a, b, c, d, e) { var f = {}, g = []; return { restrict:"EA", templateUrl:"views/directives/header/project-header.html", link:function(a, h) { var i = h.find(".selectpicker"), j = [], k = function() { var b = a.project || {}, d = a.projectName, e = b.metadata && b.metadata.name; (d || e) && (d || (d = b.metadata.name), e || (b = { metadata:{ name:d } }), f[d] || (f[d] = b), g = c("orderByDisplayName")(f), j = _.map(g, function(a) { return $("')), i.append($('')), i.selectpicker("refresh")); }; d.list("projects", a, function(a) { f = a.by("metadata.name"), k(); }), k(), i.selectpicker({ iconBase:"fa", tickIcon:"fa-check" }).change(function() { var c = $(this).val(), d = "" === c ? "/" :e(c); a.$apply(function() { b.url(d); }); }), a.$on("project.settings.update", function(a, b) { f[b.metadata.name] = b, k(); }); } }; } ]).directive("projectFilter", [ "LabelFilter", function(a) { return { restrict:"E", templateUrl:"views/directives/_project-filter.html", link:function(b, c) { a.setupFilterWidget(c.find(".navbar-filter-widget"), c.find(".active-filters"), { addButtonText:"Add" }), a.toggleFilterWidget(!b.renderOptions || !b.renderOptions.hideFilterWidget), b.$watch("renderOptions", function(b) { a.toggleFilterWidget(!b || !b.hideFilterWidget); }); } }; } ]).directive("projectPage", function() { return { restrict:"E", transclude:!0, templateUrl:"views/_project-page.html" }; }).directive("navbarUtility", function() { return { restrict:"E", transclude:!0, templateUrl:"views/directives/header/_navbar-utility.html" }; }).directive("navbarUtilityMobile", function() { return { restrict:"E", transclude:!0, templateUrl:"views/directives/header/_navbar-utility-mobile.html" }; }).directive("defaultHeader", function() { return { restrict:"E", transclude:!0, templateUrl:"views/directives/header/default-header.html" }; }).directive("navPfVerticalAlt", function() { return { restrict:"EAC", link:function() { $.fn.navigation(); } }; }).directive("breadcrumbs", function() { return { restrict:"E", scope:{ breadcrumbs:"=" }, templateUrl:"views/directives/breadcrumbs.html" }; }).directive("back", [ "$window", function(a) { return { restrict:"A", link:function(b, c) { c.bind("click", function() { a.history.back(); }); } }; } ]), angular.module("openshiftConsole").directive("alerts", function() { return { restrict:"E", scope:{ alerts:"=", filter:"=?", animateSlide:"=?", hideCloseButton:"=?", toast:"=?" }, templateUrl:"views/_alerts.html", link:function(a) { a.close = function(a) { a.hidden = !0, _.isFunction(a.onClose) && a.onClose(); }, a.onClick = function(a, b) { if (_.isFunction(b.onClick)) { var c = b.onClick(); c && (a.hidden = !0); } }; } }; }), angular.module("openshiftConsole").directive("parseError", function() { return { restrict:"E", scope:{ error:"=" }, templateUrl:"views/_parse-error.html", link:function(a) { a.$watch("error", function() { a.hidden = !1; }); } }; }), angular.module("openshiftConsole").directive("toggle", [ "IS_IOS", function(a) { var b = function(a) { $("body").css("cursor", a); }, c = _.partial(b, "pointer"), d = _.partial(b, "auto"); return a && ($(document).on("shown.bs.popover", c), $(document).on("shown.bs.tooltip", c), $(document).on("hide.bs.popover", d), $(document).on("hide.bs.tooltip", d)), { restrict:"A", scope:{ dynamicContent:"@?" }, link:function(a, b, c) { var d = { container:"body", placement:"auto" }; if (c) switch (c.toggle) { case "popover": (c.dynamicContent || "" === c.dynamicContent) && a.$watch("dynamicContent", function() { $(b).popover("destroy"), setTimeout(function() { $(b).attr("data-content", a.dynamicContent).popover(d); }, 200); }), $(b).popover(d), a.$on("$destroy", function() { $(b).popover("destroy"); }); break; case "tooltip": (c.dynamicContent || "" === c.dynamicContent) && a.$watch("dynamicContent", function() { $(b).tooltip("destroy"), setTimeout(function() { $(b).attr("title", a.dynamicContent).tooltip(d); }, 200); }), $(b).tooltip(d), a.$on("$destroy", function() { $(b).tooltip("destroy"); }); break; case "dropdown": "dropdown" === c.hover && ($(b).dropdownHover({ delay:200 }), $(b).dropdown()); } } }; } ]).directive("podWarnings", [ "podWarningsFilter", function(a) { return { restrict:"E", scope:{ pod:"=" }, link:function(b) { var c, d = "", e = a(b.pod); for (c = 0; c < e.length; c++) d && (d += "
"), "error" === e[c].severity && (b.hasError = !0), d += e[c].message; b.content = d; }, templateUrl:"views/directives/_warnings-popover.html" }; } ]).directive("routeWarnings", [ "RoutesService", function(a) { return { restrict:"E", scope:{ route:"=", service:"=", warnings:"=" }, link:function(b) { var c = function() { var c = b.warnings || a.getRouteWarnings(b.route, b.service); b.content = _.map(c, _.escape).join("
"); }; b.$watch("route", c, !0), b.$watch("service", c, !0), b.$watch("warnings", c, !0); }, templateUrl:"views/directives/_warnings-popover.html" }; } ]), angular.module("openshiftConsole").directive("takeFocus", [ "$timeout", function(a) { return { restrict:"A", link:function(b, c) { a(function() { $(c).focus(); }, 300); } }; } ]).directive("selectOnFocus", function() { return { restrict:"A", link:function(a, b) { $(b).focus(function() { $(this).select(); }); } }; }).directive("focusWhen", [ "$timeout", function(a) { return { restrict:"A", scope:{ trigger:"@focusWhen" }, link:function(b, c) { b.$watch("trigger", function(b) { b && a(function() { $(c).focus(); }); }); } }; } ]).directive("tileClick", function() { return { restrict:"AC", link:function(a, b) { $(b).click(function(a) { var c = $(a.target); c && c.closest("a", b).length || $("a.tile-target", b).trigger("click"); }); } }; }).directive("clickToReveal", function() { return { restrict:"A", transclude:!0, scope:{ linkText:"@" }, templateUrl:"views/directives/_click-to-reveal.html", link:function(a, b) { $(".reveal-contents-link", b).click(function() { $(this).hide(), $(".reveal-contents", b).show(); }); } }; }).directive("copyToClipboard", [ "IS_IOS", function(a) { return { restrict:"E", scope:{ clipboardText:"=", isDisabled:"=?", displayWide:"=?", inputText:"=?", multiline:"=?" }, templateUrl:"views/directives/_copy-to-clipboard.html", controller:[ "$scope", function(a) { a.id = _.uniqueId("clipboardJs"); } ], link:function(b, c) { if (a) return void (b.hidden = !0); var d = $("a", c), e = d.get(0); b.inputText && (e = d.get(1)); var f = new Clipboard(e); f.on("success", function(a) { $(a.trigger).attr("title", "Copied!").tooltip("fixTitle").tooltip("show").attr("title", "Copy to clipboard").tooltip("fixTitle"), a.clearSelection(); }), f.on("error", function(a) { var b = /Mac/i.test(navigator.userAgent) ? "Press ⌘C to copy" :"Press Ctrl-C to copy"; $(a.trigger).attr("title", b).tooltip("fixTitle").tooltip("show").attr("title", "Copy to clipboard").tooltip("fixTitle"); }), c.on("$destroy", function() { f.destroy(); }); } }; } ]).directive("shortId", function() { return { restrict:"E", scope:{ id:"@" }, template:'{{id.substring(0, 6)}}' }; }).directive("customIcon", function() { return { restrict:"E", scope:{ resource:"=", kind:"@", tag:"=?" }, controller:[ "$scope", "$filter", function(a, b) { a.$watchGroup([ "resource", "tag" ], function() { a.tag ? a.icon = b("imageStreamTagAnnotation")(a.resource, "icon", a.tag) :a.icon = b("annotation")(a.resource, "icon"), a.isDataIcon = a.icon && 0 === a.icon.indexOf("data:"), a.isDataIcon || (a.tag ? a.icon = b("imageStreamTagIconClass")(a.resource, a.tag) :a.icon = b("iconClass")(a.resource, a.kind)); }); } ], templateUrl:"views/directives/_custom-icon.html" }; }).directive("bottomOfWindow", function() { return { restrict:"A", link:function(a, b) { function c() { var a = $(window).height() - b[0].getBoundingClientRect().top; b.css("height", a - 10 + "px"); } $(window).on("resize", c), c(), b.on("$destroy", function() { $(window).off("resize", c); }); } }; }).directive("onEnter", function() { return function(a, b, c) { b.bind("keydown keypress", function(b) { 13 === b.which && (a.$apply(function() { a.$eval(c.onEnter); }), b.preventDefault()); }); }; }).directive("persistTabState", [ "$routeParams", "$location", function(a, b) { return { restrict:"A", scope:!1, link:function(c) { c.selectedTab = c.selectedTab || {}, a.tab && (c.selectedTab[a.tab] = !0), c.$watch("selectedTab", function() { var a = _.keys(_.pick(c.selectedTab, function(a) { return a; })); if (1 === a.length) { var d = b.search(); d.tab = a[0], b.replace().search(d); } }, !0); } }; } ]), angular.module("openshiftConsole").directive("labels", [ "$location", "$timeout", "LabelFilter", function(a, b, c) { return { restrict:"E", scope:{ labels:"=", clickable:"@?", kind:"@?", projectName:"@?", limit:"=?", titleKind:"@?", navigateUrl:"@?", filterCurrentPage:"=?" }, templateUrl:"views/directives/labels.html", link:function(d) { d.filterAndNavigate = function(e, f) { d.kind && d.projectName && (d.filterCurrentPage || a.url(d.navigateUrl || "/project/" + d.projectName + "/browse/" + d.kind), b(function() { var a = {}; a[e] = f, c.setLabelSelector(new LabelSelector(a, (!0))); }, 1)); }; } }; } ]).directive("labelEditor", function() { function a(a) { return !(a.length > f) && e.test(a); } function b(a) { return !(a.length > d) && c.test(a); } var c = /^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$/, d = 63, e = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$/, f = 253; return { restrict:"E", scope:{ labels:"=", systemLabels:"=", expand:"=?", canToggle:"=?", deletePolicy:"@?", helpText:"@?" }, templateUrl:"views/directives/label-editor.html", link:function(a, b, c) { angular.isDefined(c.canToggle) || (a.canToggle = !0); }, controller:[ "$scope", function(c) { var d = { test:function(c) { var d = c.split("/"); switch (d.length) { case 1: return b(d[0]); case 2: return a(d[0]) && b(d[1]); } return !1; } }; angular.extend(c, { validator:{ key:d, value:d } }); } ] }; }), angular.module("openshiftConsole").directive("editLifecycleHook", function() { return { restrict:"E", scope:{ type:"@", hookParams:"=model", availableVolumes:"=", availableContainers:"=", namespace:"=" }, templateUrl:"views/directives/edit-lifecycle-hook.html", controller:[ "$scope", function(a) { a.view = { isDisabled:!1 }, a.lifecycleHookFailurePolicyTypes = [ "Abort", "Retry", "Ignore" ], a.istagHook = {}, a.removedHookParams = {}, a.action = { type:_.has(a.hookParams, "tagImages") ? "tagImages" :"execNewPod" }; var b = { command:[], env:[], volumes:[], containerName:a.availableContainers[0] || "" }, c = { to:{}, containerName:a.availableContainers[0] || "" }, d = function(b) { var c = {}; if (_.isEmpty(b)) c = { namespace:a.namespace, imageStream:"", tagObject:null }; else { var d = b.name.split(":"); c = { namespace:b.namespace || a.namespace, imageStream:d[0], tagObject:{ tag:d[1] } }; } return c; }, e = function() { "execNewPod" === a.action.type ? (_.has(a.removedHookParams, "execNewPod") ? a.hookParams.execNewPod = a.removedHookParams.execNewPod :a.hookParams.execNewPod = _.get(a, "hookParams.execNewPod", {}), a.hookParams.execNewPod = _.merge(angular.copy(b), a.hookParams.execNewPod)) :(_.has(a.removedHookParams, "tagImages") ? a.hookParams.tagImages = a.removedHookParams.tagImages :a.hookParams.tagImages = _.get(a, "hookParams.tagImages", [ {} ]), a.hookParams.tagImages = [ _.merge(angular.copy(c), a.hookParams.tagImages[0]) ], a.istagHook = d(_.head(a.hookParams.tagImages).to)), a.hookParams.failurePolicy = _.get(a.hookParams, "failurePolicy", "Abort"); }; a.addHook = function() { return _.isEmpty(a.removedHookParams) ? (a.hookParams = {}, void e()) :void (a.hookParams = a.removedHookParams); }, a.removeHook = function() { a.removedHookParams = a.hookParams, delete a.hookParams, a.editForm.$setDirty(); }; var f = function() { a.hookParams && ("execNewPod" === a.action.type ? (a.hookParams.tagImages && (a.removedHookParams.tagImages = a.hookParams.tagImages, delete a.hookParams.tagImages), e()) :"tagImages" === a.action.type && (a.hookParams.execNewPod && (a.removedHookParams.execNewPod = a.hookParams.execNewPod, delete a.hookParams.execNewPod), e())); }; a.$watchGroup([ "hookParams", "action.type" ], f), a.$watch("istagHook.tagObject.tag", function() { _.has(a.istagHook, [ "tagObject", "tag" ]) && (_.set(a.hookParams, "tagImages[0].to.kind", "ImageStreamTag"), _.set(a.hookParams, "tagImages[0].to.namespace", a.istagHook.namespace), _.set(a.hookParams, "tagImages[0].to.name", a.istagHook.imageStream + ":" + a.istagHook.tagObject.tag)); }); } ] }; }).directive("lifecycleHook", [ "$filter", function(a) { return { restrict:"E", scope:{ deploymentConfig:"=", type:"@" }, templateUrl:"views/directives/lifecycle-hook.html", link:function(b) { b.$watch("deploymentConfig", function(c) { b.strategyParams = a("deploymentStrategyParams")(c); }); } }; } ]), angular.module("openshiftConsole").directive("actionChip", function() { return { restrict:"E", scope:{ key:"=?", value:"=?", keyHelp:"=?", valueHelp:"=", action:"&?", actionIcon:"=?", showAction:"=?" }, templateUrl:"views/directives/action-chip.html" }; }), angular.module("openshiftConsole").directive("templateOptions", function() { return { restrict:"E", templateUrl:"views/_templateopt.html", scope:{ parameters:"=", expand:"=?", canToggle:"=?" }, link:function(a, b, c) { angular.isDefined(c.canToggle) || (a.canToggle = !0), a.isOnlyWhitespace = function(a) { return /^\s+$/.test(a); }, a.focus = function(a) { angular.element("#" + a).focus(); }; } }; }), angular.module("openshiftConsole").directive("tasks", function() { return { restrict:"E", templateUrl:"views/_tasks.html" }; }), angular.module("openshiftConsole").directive("truncateLongText", [ "truncateFilter", function(a) { return { restrict:"E", scope:{ content:"=", limit:"=", newlineLimit:"=", useWordBoundary:"=", expandable:"=", prettifyJson:"=" }, templateUrl:"views/directives/truncate-long-text.html", link:function(b) { b.toggles = { expanded:!1 }, b.$watch("content", function(c) { c ? (b.truncatedContent = a(c, b.limit, b.useWordBoundary, b.newlineLimit), b.truncated = b.truncatedContent.length !== c.length) :(b.truncatedContent = null, b.truncated = !1); }); } }; } ]), angular.module("openshiftConsole").directive("catalog", [ "CatalogService", "Constants", "KeywordService", "Logger", function(a, b, c, d) { return { restrict:"E", scope:{ projectImageStreams:"=", openshiftImageStreams:"=", projectTemplates:"=", openshiftTemplates:"=", projectName:"=", parentCategory:"=category" }, templateUrl:"views/catalog/catalog.html", link:function(e) { function f() { var b = e.keywords = c.generateKeywords(e.filter.keyword); return _.isEmpty(b) ? (e.filterActive = !1, e.filteredBuildersByCategory = e.buildersByCategory, void (e.filteredTemplatesByCategory = e.templatesByCategory)) :(e.filterActive = !0, e.filteredBuildersByCategory = {}, _.each(e.buildersByCategory, function(c, d) { var f = a.getCategoryItem(d), g = function(a) { return a.test(f.label); }, h = _.reject(b, g); e.filteredBuildersByCategory[d] = a.filterImageStreams(c, h); }), e.filteredTemplatesByCategory = {}, void _.each(e.templatesByCategory, function(c, d) { var f = a.getCategoryItem(d), g = function(a) { return a.test(f.label); }, h = _.reject(b, g); e.filteredTemplatesByCategory[d] = a.filterTemplates(c, h); })); } function g() { if (e.projectImageStreams && e.openshiftImageStreams) { var b = _.toArray(e.projectImageStreams).concat(_.toArray(e.openshiftImageStreams)); e.buildersByCategory = a.categorizeImageStreams(b), e.emptyCatalog = e.emptyCatalog && _.every(e.buildersByCategory, _.isEmpty), j(); } } function h() { if (e.projectTemplates && e.openshiftTemplates) { var b = _.toArray(e.projectTemplates).concat(_.toArray(e.openshiftTemplates)); e.templatesByCategory = a.categorizeTemplates(b), e.emptyCatalog = e.emptyCatalog && _.every(e.templatesByCategory, _.isEmpty), j(); } } function i() { e.noFilterMatches = !0, k = []; var a = {}; _.each(e.filteredBuildersByCategory, function(b, c) { a[c] = _.size(b); }), _.each(e.filteredTemplatesByCategory, function(b, c) { a[c] = (a[c] || 0) + _.size(b); }), e.allContentHidden = !0, _.each(e.categories, function(b) { var c = !1; _.each(b.items, function(b) { a[b.id] && (k.push(b), c = !0); }), _.set(e, [ "hasContent", b.id ], c), c && (e.allContentHidden = !1); }), e.countByCategory = a; } function j() { e.loaded = e.projectTemplates && e.openshiftTemplates && e.projectImageStreams && e.openshiftImageStreams, f(), i(), e.loaded && (e.parentCategory && 1 === k.length && (e.singleCategory = _.head(k)), d.log("templates by category", e.templatesByCategory), d.log("builder images", e.buildersByCategory)); } e.categories = _.get(e, "parentCategory.subcategories", b.CATALOG_CATEGORIES), e.loaded = !1, e.emptyCatalog = !0, e.filter = { keyword:"" }, e.$watch("filter.keyword", _.debounce(function() { e.$apply(function() { f(), i(); }); }, 200, { maxWait:1e3, trailing:!0 })); var k; e.$watchGroup([ "openshiftImageStreams", "projectImageStreams" ], g), e.$watchGroup([ "openshiftTemplates", "projectTemplates" ], h); } }; } ]), angular.module("openshiftConsole").directive("categoryContent", [ "CatalogService", "Constants", "KeywordService", "Logger", function(a, b, c, d) { return { restrict:"E", scope:{ projectImageStreams:"=", openshiftImageStreams:"=", projectTemplates:"=", openshiftTemplates:"=", projectName:"=", category:"=" }, templateUrl:"views/catalog/category-content.html", link:function(b) { function e() { var d = b.keywords = c.generateKeywords(b.filter.keyword); b.filteredBuilderImages = a.filterImageStreams(k, d), b.filteredTemplates = a.filterTemplates(l, d); } function f() { return b.projectImageStreams && b.openshiftImageStreams ? _.toArray(b.projectImageStreams).concat(_.toArray(b.openshiftImageStreams)) :[]; } function g() { var c = a.categorizeImageStreams(f()); k = _.get(c, [ b.category.id ], []), j(); } function h() { return b.projectTemplates && b.openshiftTemplates ? _.toArray(b.projectTemplates).concat(_.toArray(b.openshiftTemplates)) :[]; } function i() { var c = a.categorizeTemplates(h()); l = _.get(c, [ b.category.id ], []), j(); } function j() { b.loaded = b.projectTemplates && b.openshiftTemplates && b.projectImageStreams && b.openshiftImageStreams, e(), b.emptyCategory = _.isEmpty(k) && _.isEmpty(l), b.loaded && (d.log("templates", l), d.log("builder images", k)); } var k = [], l = []; b.filteredTemplates = [], b.filteredBuilderImages = [], b.loaded = !1, b.filter = { keyword:"" }, b.$watch("filter.keyword", e), b.$watchGroup([ "openshiftImageStreams", "projectImageStreams" ], g), b.$watchGroup([ "openshiftTemplates", "projectTemplates" ], i); } }; } ]), angular.module("openshiftConsole").directive("catalogImage", [ "$filter", function(a) { return { restrict:"E", replace:!0, scope:{ image:"=", imageStream:"=", project:"@", isBuilder:"=?", keywords:"=" }, templateUrl:"views/catalog/_image.html", link:function(b) { var c = a("imageStreamTagTags"), d = {}; b.referencedBy = {}; var e = _.get(b, "imageStream.spec.tags", []), f = {}; _.each(e, function(a) { f[a.name] = c(b.imageStream, a.name), a.from && "ImageStreamTag" === a.from.kind && a.from.name.indexOf(":") === -1 && !a.from.namespace && (d[a.name] = !0, b.referencedBy[a.from.name] = b.referencedBy[a.from.name] || [], b.referencedBy[a.from.name].push(a.name)); }); var g = function(a) { var b = _.get(f, [ a ], []); return _.includes(b, "builder") && !_.includes(b, "hidden"); }; b.$watch("imageStream.status.tags", function(a) { b.tags = _.filter(a, function(a) { return g(a.tag) && !d[a.tag]; }); var c = _.get(b, "is.tag.tag"); c && _.some(b.tags, { tag:c }) || _.set(b, "is.tag", _.head(b.tags)); }); } }; } ]), angular.module("openshiftConsole").directive("catalogTemplate", function() { return { restrict:"E", replace:!0, scope:{ template:"=", project:"@", keywords:"=" }, templateUrl:"views/catalog/_template.html" }; }), angular.module("openshiftConsole").directive("oscObjectDescriber", [ "ObjectDescriber", function(a) { return { restrict:"E", scope:{}, templateUrl:"views/directives/osc-object-describer.html", link:function(b, c, d) { var e = a.onResourceChanged(function(a, c) { b.$apply(function() { b.kind = c, b.resource = a; }); }); b.$on("$destroy", function() { a.removeResourceChangedCallback(e); }); } }; } ]).directive("oscObject", [ "ObjectDescriber", function(a) { return { restrict:"AC", scope:{ resource:"=", kind:"@" }, link:function(b, c, d) { $(c).on("click.oscobject", function(c) { if (!($(c.target).closest("a").length > 0)) return b.resource ? (a.setObject(b.resource, b.kind || b.resource.kind, { source:b }), !1) :void 0; }), $(c).on("mousemove.oscobject", function() { if (b.resource || $(this).hasClass("osc-object-stacked")) return $(".osc-object-hover").not(this).removeClass("osc-object-hover"), $(this).addClass("osc-object-hover"), !1; }), $(c).on("mouseleave.oscobject", function() { (b.resource || $(this).hasClass("osc-object-stacked")) && $(this).removeClass("osc-object-hover"); }); var e = a.onResourceChanged(function(a, d) { a && a.metadata && b.resource && b.resource.metadata && a.metadata.uid == b.resource.metadata.uid ? $(c).addClass("osc-object-active") :$(c).removeClass("osc-object-active"); }); b.$watch("resource", function(c, d) { a.getSource() === b && a.setObject(b.resource, b.kind || b.resource.kind, { source:b }); }), b.$on("$destroy", function() { a.removeResourceChangedCallback(e), a.getSource() === b && a.clearObject(); }); } }; } ]).filter("isOscActiveObject", [ "ObjectDescriber", "uidFilter", function(a, b) { return function(c) { var d = a.getResource(); return b(c) === b(d); }; } ]).service("ObjectDescriber", [ "$timeout", function(a) { function b() { this.resource = null, this.kind = null, this.source = null, this.callbacks = $.Callbacks(); } return b.prototype.setObject = function(b, c, d) { this.resource = b, this.kind = c, d = d || {}, this.source = d.source || null; var e = this; a(function() { e.callbacks.fire(b, c); }, 0); }, b.prototype.clearObject = function() { this.setObject(null, null); }, b.prototype.getResource = function() { return this.resource; }, b.prototype.getSource = function() { return this.source; }, b.prototype.onResourceChanged = function(b) { this.callbacks.add(b); var c = this; return this.resource && a(function() { b(c.resource, c.kind); }, 0), b; }, b.prototype.removeResourceChangedCallback = function(a) { this.callbacks.remove(a); }, new b(); } ]), angular.module("openshiftConsole").directive("podMetrics", [ "$filter", "$interval", "$parse", "$timeout", "$q", "$rootScope", "ChartsService", "ConversionService", "MetricsCharts", "MetricsService", "ModalsService", "usageValueFilter", function(a, b, c, d, e, f, g, h, i, j, k, l) { return { restrict:"E", scope:{ pod:"=", includedMetrics:"=?", stackDonut:"=?", alerts:"=?" }, templateUrl:"views/directives/pod-metrics.html", link:function(m) { function n(a) { if (!m.pod) return null; var b = m.options.selectedContainer; switch (a) { case "memory/usage": var c = D(b); if (c) return h.bytesToMiB(l(c)); break; case "cpu/usage_rate": var d = E(b); if (d) return l(d); } return null; } function o(a) { var b = _.head(a.datasets); if (b.total) { var c, e = { type:"donut", columns:[ [ "Used", b.used ], [ "Available", Math.max(b.available, 0) ] ], colors:{ Used:b.available > 0 ? "#0088ce" :"#ec7a08", Available:"#d1d1d1" } }; B[b.id] ? B[b.id].load(e) :(c = I(a), c.data = e, d(function() { G || (B[b.id] = c3.generate(c)); })); } } function p(a) { var b = _.some(a.datasets, function(a) { return !a.data; }); if (!b) { var c = {}; _.each(a.datasets, function(a) { c[a.id] = a.data; }); var e, f = i.getSparklineData(c), g = a.chartPrefix + "sparkline"; C[g] ? C[g].load(f) :(e = J(a), e.data = f, a.chartDataColors && (e.color = { pattern:a.chartDataColors }), d(function() { G || (C[g] = c3.generate(e)); })); } } function q() { return "-" + m.options.timeRange.value + "mn"; } function r() { return 60 * m.options.timeRange.value * 1e3; } function s() { return Math.floor(r() / F) + "ms"; } function t(a, b, c) { var d, e = { metric:b.id, bucketDuration:s() }; return b.data && b.data.length ? (d = _.last(b.data), e.start = d.end) :e.start = c, m.pod ? _.assign(e, { namespace:m.pod.metadata.namespace, pod:m.pod, containerName:a.containerMetric ? m.options.selectedContainer.name :"pod" }) :null; } function u() { K = 0, _.each(m.metrics, function(a) { p(a), o(a); }); } function v(a) { if (!G) { if (K++, m.noData) return void (m.metricsError = { status:_.get(a, "status", 0), details:_.get(a, "data.errorMsg") || _.get(a, "statusText") || "Status code " + _.get(a, "status", 0) }); if (!(K < 2)) { var b = "metrics-failed-" + m.uniqueID; m.alerts[b] = { type:"error", message:"An error occurred updating metrics for pod " + _.get(m, "pod.metadata.name", "") + ".", links:[ { href:"", label:"Retry", onClick:function() { delete m.alerts[b], K = 1, z(); } } ] }; } } } function w() { return !(m.metricsError || K > 1) && (m.pod && _.get(m, "options.selectedContainer")); } function x(a, b, c) { b.total = n(b.id), b.total && (m.hasLimits = !0); var d = _.get(c, "usage.value"); isNaN(d) && (d = 0), a.convert && (d = a.convert(d)), b.used = d3.round(d, a.usagePrecision), b.total && (b.available = d3.round(b.total - d, a.usagePrecision)), a.totalUsed += b.used; } function y(a, b) { m.noData = !1; var c = _.initial(b.data); return a.data ? void (a.data = _.chain(a.data).takeRight(F).concat(c).value()) :void (a.data = c); } function z() { if (w()) { var a = q(), b = []; angular.forEach(m.metrics, function(c) { var d = []; c.totalUsed = 0, angular.forEach(c.datasets, function(e) { var f = t(c, e, a); if (f) { var g = j.get(f); d.push(g); var h = n(e.id); h && b.push(j.getCurrentUsage(f).then(function(a) { x(c, e, a); })); } }), b = b.concat(d), e.all(d).then(function(a) { G || angular.forEach(a, function(a) { if (a) { var b = _.find(c.datasets, { id:a.metricID }); y(b, a); } }); }); }), e.all(b).then(u, v)["finally"](function() { m.loaded = !0; }); } } m.includedMetrics = m.includedMetrics || [ "cpu", "memory", "network" ]; var A, B = {}, C = {}, D = c("resources.limits.memory"), E = c("resources.limits.cpu"), F = 30, G = !1; m.uniqueID = i.uniqueID(), m.metrics = [], _.includes(m.includedMetrics, "memory") && m.metrics.push({ label:"Memory", units:"MiB", chartPrefix:"memory-", convert:h.bytesToMiB, containerMetric:!0, datasets:[ { id:"memory/usage", label:"Memory", data:[] } ] }), _.includes(m.includedMetrics, "cpu") && m.metrics.push({ label:"CPU", units:"cores", chartPrefix:"cpu-", convert:h.millicoresToCores, usagePrecision:3, containerMetric:!0, datasets:[ { id:"cpu/usage_rate", label:"CPU", data:[] } ] }), _.includes(m.includedMetrics, "network") && m.metrics.push({ label:"Network", units:"KiB/s", chartPrefix:"network-", chartType:"spline", convert:h.bytesToKiB, datasets:[ { id:"network/tx_rate", label:"Sent", data:[] }, { id:"network/rx_rate", label:"Received", data:[] } ] }), m.loaded = !1, m.noData = !0, m.showComputeUnitsHelp = function() { k.showComputeUnitsHelp(); }, j.getMetricsURL().then(function(a) { m.metricsURL = a; }), m.options = { rangeOptions:i.getTimeRangeOptions() }, m.options.timeRange = _.head(m.options.rangeOptions); var H = a("upperFirst"), I = function(a) { var b = "#" + a.chartPrefix + m.uniqueID + "-donut"; return { bindto:b, onrendered:function() { g.updateDonutCenterText(b, a.datasets[0].used, H(a.units) + " Used"); }, donut:{ label:{ show:!1 }, width:10 }, legend:{ show:!1 }, size:{ height:175, widht:175 } }; }, J = function(a) { var b = a.chartPrefix + m.uniqueID + "-sparkline", c = i.getDefaultSparklineConfig(b, a.units); return 1 === a.datasets.length && _.set(c, "legend.show", !1), c; }, K = 0; m.$watch("options", function() { _.each(m.metrics, function(a) { _.each(a.datasets, function(a) { delete a.data; }); }), delete m.metricsError, z(); }, !0), A = b(z, i.getDefaultUpdateInterval(), !1), f.$on("metrics.charts.resize", function() { i.redraw(B), i.redraw(C); }), m.$on("$destroy", function() { A && (b.cancel(A), A = null), angular.forEach(B, function(a) { a.destroy(); }), B = null, angular.forEach(C, function(a) { a.destroy(); }), C = null, G = !0; }); } }; } ]), angular.module("openshiftConsole").directive("deploymentMetrics", [ "$interval", "$parse", "$timeout", "$q", "$rootScope", "ChartsService", "ConversionService", "MetricsCharts", "MetricsService", "ModalsService", function(a, b, c, d, e, f, g, h, i, j) { return { restrict:"E", scope:{ pods:"=", containers:"=", profile:"@", alerts:"=?" }, templateUrl:function(a, b) { return "compact" === b.profile ? "views/directives/metrics-compact.html" :"views/directives/deployment-metrics.html"; }, link:function(b) { function c(a) { return null === a.value || void 0 === a.value; } function d(a) { var b; b = w ? a.compactDatasetLabel || a.label :"Average Usage"; var d = {}, e = [ "Date" ], f = [ b ], g = [ e, f ], h = function(a) { var b = "" + a.start; return d[b] || (d[b] = { total:0, count:0 }), d[b]; }; return _.each(A[a.descriptor], function(a) { _.each(a, function(a) { var b = h(a); (!y || y < a.end) && (y = a.end), c(a) || (b.total += a.value, b.count = b.count + 1); }); }), _.each(d, function(b, c) { var d; d = b.count ? b.total / b.count :null, e.push(Number(c)), f.push(a.convert ? a.convert(d) :d); }), f.length > 1 && (a.lastValue = _.last(f) || 0), g; } function f(a, e) { var f = [], g = { type:"spline" }; return b.showAverage ? (_.each(a[e.descriptor], function(a, b) { r(e.descriptor, b, a); }), g.type = "area-spline", w && e.compactType && (g.type = e.compactType), g.x = "Date", g.columns = d(e), g) :(_.each(a[e.descriptor], function(a, b) { r(e.descriptor, b, a); var d = b + "-dates"; _.set(g, [ "xs", b ], d); var h = [ d ], i = [ b ]; f.push(h), f.push(i), _.each(A[e.descriptor][b], function(a) { if (h.push(a.start), (!y || y < a.end) && (y = a.end), c(a)) i.push(a.value); else { var b = e.convert ? e.convert(a.value) :a.value; i.push(b); } }); }), g.columns = _.sortBy(f, function(a) { return a[0]; }), g); } function k(a) { x || (E = 0, b.showAverage = _.size(b.pods) > 5 || w, _.each(b.metrics, function(c) { var d, e = f(a, c), g = c.descriptor; w && c.compactCombineWith && (g = c.compactCombineWith, c.lastValue && (D[g].lastValue = (D[g].lastValue || 0) + c.lastValue)), u[g] ? (u[g].load(e), b.showAverage ? u[g].legend.hide() :u[g].legend.show()) :(d = F(c), d.data = e, u[g] = c3.generate(d)); })); } function l() { return w ? "-15mn" :"-" + b.options.timeRange.value + "mn"; } function m() { return 60 * b.options.timeRange.value * 1e3; } function n() { return w ? "1mn" :Math.floor(m() / v) + "ms"; } function o() { var a = _.find(b.pods, "metadata.namespace"); if (a) { var c = { pods:b.pods, containerName:b.options.selectedContainer.name, namespace:a.metadata.namespace, bucketDuration:n() }; return y ? c.start = y :c.start = l(), c; } } function p(a) { if (!x) { if (E++, b.noData) return void (b.metricsError = { status:_.get(a, "status", 0), details:_.get(a, "data.errorMsg") || _.get(a, "statusText") || "Status code " + _.get(a, "status", 0) }); if (!(E < 2)) { var c = "metrics-failed-" + b.uniqueID; b.alerts[c] = { type:"error", message:"An error occurred updating metrics.", links:[ { href:"", label:"Retry", onClick:function() { delete b.alerts[c], E = 1, s(); } } ] }; } } } function q() { var a = _.isEmpty(b.pods); return a ? (b.loaded = !0, !1) :!b.metricsError && E < 2; } function r(a, c, d) { b.noData = !1; var e = _.initial(d), f = _.get(A, [ a, c ]); if (!f) return void _.set(A, [ a, c ], e); var g = _.takeRight(f.concat(e), v); _.set(A, [ a, c ], g); } function s() { if (!B && q()) { z = Date.now(); var a = o(); i.getPodMetrics(a).then(k, p)["finally"](function() { b.loaded = !0; }); } } var t, u = {}, v = 30, w = "compact" === b.profile, x = !1; b.uniqueID = h.uniqueID(); var y, z, A = {}, B = w, C = function(a) { return a >= 1024; }; b.metrics = [ { label:"Memory", units:"MiB", convert:g.bytesToMiB, formatUsage:function(a) { return C(a) && (a /= 1024), h.formatUsage(a); }, usageUnits:function(a) { return C(a) ? "GiB" :"MiB"; }, descriptor:"memory/usage", type:"pod_container", chartID:"memory-" + b.uniqueID }, { label:"CPU", units:"cores", convert:g.millicoresToCores, formatUsage:h.formatUsage, usageUnits:function() { return "cores"; }, descriptor:"cpu/usage_rate", type:"pod_container", chartID:"cpu-" + b.uniqueID }, { label:"Network (Sent)", units:"KiB/s", convert:g.bytesToKiB, formatUsage:h.formatUsage, usageUnits:function() { return "KiB/s"; }, descriptor:"network/tx_rate", type:"pod", compactLabel:"Network", compactDatasetLabel:"Sent", compactType:"spline", chartID:"network-tx-" + b.uniqueID }, { label:"Network (Received)", units:"KiB/s", convert:g.bytesToKiB, formatUsage:h.formatUsage, usageUnits:function() { return "KiB/s"; }, descriptor:"network/rx_rate", type:"pod", compactCombineWith:"network/tx_rate", compactDatasetLabel:"Received", compactType:"spline", chartID:"network-rx-" + b.uniqueID } ]; var D = _.indexBy(b.metrics, "descriptor"); b.loaded = !1, b.noData = !0, b.showComputeUnitsHelp = function() { j.showComputeUnitsHelp(); }; var E = 0; i.getMetricsURL().then(function(a) { b.metricsURL = a; }), b.options = { rangeOptions:h.getTimeRangeOptions() }, b.options.timeRange = _.head(b.options.rangeOptions), b.options.selectedContainer = _.head(b.containers); var F = function(a) { var c = h.getDefaultSparklineConfig(a.chartID, a.units, w); return _.set(c, "legend.show", !w && !b.showAverage), c; }; b.$watch("options", function() { A = {}, y = null, delete b.metricsError, s(); }, !0), t = a(s, h.getDefaultUpdateInterval(), !1), b.updateInView = function(a) { B = !a, a && (!z || Date.now() > z + h.getDefaultUpdateInterval()) && s(); }, e.$on("metrics.charts.resize", function() { h.redraw(u); }), b.$on("$destroy", function() { t && (a.cancel(t), t = null), angular.forEach(u, function(a) { a.destroy(); }), u = null, x = !0; }); } }; } ]), angular.module("openshiftConsole").directive("logViewer", [ "$sce", "$timeout", "$window", "$filter", "AuthService", "APIService", "APIDiscovery", "DataService", "HTMLService", "ModalsService", "logLinks", "BREAKPOINTS", function(a, b, c, d, e, f, g, h, i, j, k, l) { var m = $(window), n = $('').get(0), o = function(a, b) { var c = n.cloneNode(!0); c.firstChild.setAttribute("data-line-number", a); var d = ansi_up.escape_for_html(b), e = ansi_up.ansi_to_html(d), f = i.linkify(e, "_blank", !0); return c.lastChild.innerHTML = f, c; }; return { restrict:"AE", transclude:!0, templateUrl:"views/directives/logs/_log-viewer.html", scope:{ followAffixTop:"=?", object:"=", fullLogUrl:"=?", name:"=", context:"=", options:"=?", fixedHeight:"=?", chromeless:"=?", empty:"=?", run:"=?" }, controller:[ "$scope", function(i) { var j, n, p, q, r, s = document.documentElement; i.logViewerID = _.uniqueId("log-viewer"), i.empty = !0; var t, u; "ReplicationController" === i.object.kind ? (t = "deploymentconfigs/log", u = d("annotation")(i.object, "deploymentConfig")) :(t = f.kindToResource(i.object.kind) + "/log", u = i.object.metadata.name); var v = function() { q = window.innerWidth < l.screenSmMin && !i.fixedHeight ? null :n; }, w = function() { i.$apply(function() { var a = j.getBoundingClientRect(); i.fixedHeight ? i.showScrollLinks = a && a.height > i.fixedHeight :i.showScrollLinks = a && (a.top < 0 || a.bottom > s.clientHeight); }); }, x = !1, y = function() { x ? x = !1 :i.$evalAsync(function() { i.autoScrollActive = !1; }); }, z = function() { p.off("scroll", y), m.off("scroll", y), window.innerWidth <= l.screenSmMin && !i.fixedHeight ? m.on("scroll", y) :p.on("scroll", y); }, A = function() { i.fixedHeight || (window.innerWidth < l.screenSmMin && !i.fixedHeight ? r.removeClass("target-logger-node").affix({ target:window, offset:{ top:i.followAffixTop || 0 } }) :r.addClass("target-logger-node").affix({ target:p, offset:{ top:i.followAffixTop || 0 } })); }, B = function(a) { var b = $("#" + i.logViewerID + " .log-view-output"), c = b.offset().top; if (!(c < 0)) { var d = $(".ellipsis-pulser").outerHeight(!0), e = i.fixedHeight ? i.fixedHeight :Math.floor($(window).height() - c - d); i.chromeless || i.fixedHeight || (e -= 40), a ? b.animate({ "min-height":e + "px" }, "fast") :b.css("min-height", e + "px"), i.fixedHeight && b.css("max-height", e); } }, C = _.debounce(function() { B(!0), v(), z(), w(), A(), y(); }, 100); m.on("resize", C); var D, E = function() { x = !0, k.scrollBottom(q); }, F = function() { i.autoScrollActive = !i.autoScrollActive, i.autoScrollActive && E(); }, G = document.createDocumentFragment(), H = _.debounce(function() { j.appendChild(G), G = document.createDocumentFragment(), i.autoScrollActive && E(), i.showScrollLinks || w(); }, 100, { maxWait:300 }), I = function(a) { D && (D.stop(), D = null), a || (H.cancel(), j && (j.innerHTML = ""), G = document.createDocumentFragment()); }, J = function() { if (I(), i.run) { angular.extend(i, { loading:!0, autoScrollActive:!0, limitReached:!1, showScrollLinks:!1 }); var a = angular.extend({ follow:!0, tailLines:5e3, limitBytes:10485760 }, i.options); D = h.createStream(t, u, i.context, a); var c = 0, d = function(a) { c++, G.appendChild(o(c, a)), H(); }; D.onMessage(function(b, e, f) { i.$evalAsync(function() { i.empty = !1, "logs" !== i.state && (i.state = "logs", setTimeout(B)); }), b && (a.limitBytes && f >= a.limitBytes && (i.$evalAsync(function() { i.limitReached = !0, i.loading = !1; }), I(!0)), d(b), !i.largeLog && c >= a.tailLines && i.$evalAsync(function() { i.largeLog = !0; })); }), D.onClose(function() { D = null, i.$evalAsync(function() { i.autoScrollActive = !1, 0 !== c || i.emptyStateMessage || (i.state = "empty", i.emptyStateMessage = "The logs are no longer available or could not be loaded."); }), b(function() { i.loading = !1; }, 100); }), D.onError(function() { D = null, i.$evalAsync(function() { angular.extend(i, { loading:!1, autoScrollActive:!1 }), 0 === c ? (i.state = "empty", i.emptyStateMessage = "The logs are no longer available or could not be loaded.") :i.errorWhileRunning = !0; }); }), D.start(); } }; return g.getLoggingURL().then(function(b) { var d = _.get(i.context, "project.metadata.name"), f = _.get(i.options, "container"); d && f && u && b && (angular.extend(i, { kibanaAuthUrl:a.trustAsResourceUrl(URI(b).segment("auth").segment("token").normalizePathname().toString()), access_token:e.UserStore().getToken() }), i.$watchGroup([ "context.project.metadata.name", "options.container", "name" ], function() { angular.extend(i, { kibanaArchiveUrl:a.trustAsResourceUrl(k.archiveUri({ namespace:i.context.project.metadata.name, namespaceUid:i.context.project.metadata.uid, podname:u, containername:i.options.container, backlink:URI.encode(c.location.href) })) }); })); }), this.cacheScrollableNode = function(a) { n = a, p = $(n); }, this.cacheLogNode = function(a) { j = a; }, this.cacheAffixable = function(a) { r = $(a); }, this.start = function() { v(), z(), A(); }, angular.extend(i, { ready:!0, loading:!0, autoScrollActive:!0, state:!1, onScrollBottom:function() { k.scrollBottom(q); }, onScrollTop:function() { i.autoScrollActive = !1, k.scrollTop(q); }, toggleAutoScroll:F, goChromeless:k.chromelessLink, restartLogs:J }), i.$on("$destroy", function() { I(), m.off("resize", C), m.off("scroll", y), p.off("scroll", y); }), "deploymentconfigs/logs" !== t || u ? void i.$watchGroup([ "name", "options.container", "run" ], J) :(i.state = "empty", void (i.emptyStateMessage = "Logs are not available for this replication controller because it was not generated from a deployment configuration.")); } ], require:"logViewer", link:function(a, c, d, e) { b(function() { e.cacheScrollableNode(document.getElementById(a.fixedHeight ? a.logViewerID + "-fixed-scrollable" :"container-main")), e.cacheLogNode(document.getElementById(a.logViewerID + "-logContent")), e.cacheAffixable(document.getElementById(a.logViewerID + "-affixedFollow")), e.start(); }, 0); var f = function() { var b = $(c).find(".log-line-text").text(), d = _.get(a, "object.metadata.name", "openshift") + ".log", e = new Blob([ b ], { type:"text/plain;charset=utf-8" }); saveAs(e, d); }; a.canSave = !!new Blob(), a.saveLog = function() { return a.largeLog ? void j.confirmSaveLog(a.object).then(f) :void f(); }; } }; } ]), angular.module("openshiftConsole").directive("statusIcon", function() { return { restrict:"E", templateUrl:"views/directives/_status-icon.html", scope:{ status:"=", disableAnimation:"@" }, link:function(a, b, c) { a.spinning = !angular.isDefined(c.disableAnimation); } }; }), angular.module("openshiftConsole").directive("ellipsisPulser", [ function() { return { restrict:"E", scope:{ color:"@", display:"@", size:"@", msg:"@" }, templateUrl:"views/directives/_ellipsis-pulser.html" }; } ]), angular.module("openshiftConsole").directive("podDonut", [ "$timeout", "hashSizeFilter", "isPullingImageFilter", "isTerminatingFilter", "podWarningsFilter", "numContainersReadyFilter", "Logger", "ChartsService", function(a, b, c, d, e, f, g, h) { return { restrict:"E", scope:{ pods:"=", desired:"=?", idled:"=?" }, templateUrl:"views/directives/pod-donut.html", link:function(a, g) { function i() { var c, d = b(a.pods); c = angular.isNumber(a.desired) && a.desired !== d ? "scaling to " + a.desired + "..." :1 === d ? "pod" :"pods", a.idled ? h.updateDonutCenterText(g[0], "Idle") :h.updateDonutCenterText(g[0], d, c); } function j(c) { var d = { columns:[] }; angular.forEach(p, function(a) { d.columns.push([ a, c[a] || 0 ]); }), 0 === b(c) ? d.columns.push([ "Empty", 1 ]) :d.unload = "Empty", n ? n.load(d) :(o.data.columns = d.columns, n = c3.generate(o)), a.podStatusData = d.columns; } function k(a) { var b = f(a), c = a.spec.containers.length; return b === c; } function l(a) { if (d(a)) return "Terminating"; var b = e(a); return _.some(b, { severity:"error" }) ? "Failed" :_.isEmpty(b) ? c(a) ? "Pulling" :"Running" !== a.status.phase || k(a) ? _.get(a, "status.phase", "Unknown") :"Not Ready" :"Warning"; } function m() { var b = {}; return angular.forEach(a.pods, function(a) { var c = l(a); b[c] = (b[c] || 0) + 1; }), b; } var n, o, p = [ "Running", "Not Ready", "Warning", "Failed", "Pulling", "Pending", "Succeeded", "Terminating", "Unknown" ]; a.chartId = _.uniqueId("pods-donut-chart-"), o = { type:"donut", bindto:"#" + a.chartId, donut:{ expand:!1, label:{ show:!1 }, width:10 }, size:{ height:150, width:150 }, legend:{ show:!1 }, onrendered:i, tooltip:{ format:{ value:function(a, b, c) { if (a) return "Empty" === c ? "No pods exist" :a; } } }, transition:{ duration:350 }, data:{ type:"donut", groups:[ p ], order:null, colors:{ Empty:"#ffffff", Running:"#00b9e4", "Not Ready":"#beedf9", Warning:"#f39d3c", Failed:"#d9534f", Pulling:"#d1d1d1", Pending:"#ededed", Succeeded:"#3f9c35", Terminating:"#00659c", Unknown:"#f9d67a" }, selection:{ enabled:!1 } } }; var q = _.debounce(j, 350, { maxWait:500 }); a.$watch(m, q, !0), a.$watchGroup([ "desired", "idled" ], i), a.$on("destroy", function() { n && (n = n.destroy()); }); } }; } ]), angular.module("openshiftConsole").directive("routeServicePie", function() { return { restrict:"E", scope:{ route:"=" }, template:'
', link:function(a) { function b() { var b = { columns:[] }; a.route && (b.columns.push(f(a.route.spec.to)), a.totalWeight = a.route.spec.to.weight, _.each(a.route.spec.alternateBackends, function(c) { b.columns.push(f(c)), a.totalWeight += c.weight; })), a.totalWeight && (c ? (h(b), c.load(b)) :(d.data.columns = b.columns, c = c3.generate(d)), e = b); } var c, d; a.chartId = _.uniqueId("route-service-chart-"), d = { bindto:"#" + a.chartId, color:{ pattern:[ $.pfPaletteColors.blue, $.pfPaletteColors.orange, $.pfPaletteColors.green, $.pfPaletteColors.red ] }, legend:{ show:!0, position:"right" }, pie:{ label:{ show:!1 } }, size:{ height:115, width:260 }, data:{ type:"pie", order:null, selection:{ enabled:!1 } } }; var e, f = function(a) { return [ a.name, a.weight ]; }, g = function(a) { return _.head(a); }, h = function(a) { var b = {}; _.each(a.columns, function(a) { var c = g(a); b[c] = !0; }); var c = _.get(e, "columns", []); a.unload = _.chain(c).reject(function(a) { var c = g(a); return _.has(b, [ c ]); }).map(g).value(); }; a.$watch("route", b), a.$on("destroy", function() { c && (c = c.destroy()); }); } }; }), angular.module("openshiftConsole").directive("deploymentDonut", [ "$filter", "$location", "$timeout", "$uibModal", "DeploymentsService", "HPAService", "QuotaService", "LabelFilter", "Navigate", "hashSizeFilter", "hasDeploymentConfigFilter", function(a, b, c, d, e, f, g, h, i, j, k) { return { restrict:"E", scope:{ rc:"=", deploymentConfig:"=", deployment:"=", scalable:"=", hpa:"=?", limitRanges:"=", quotas:"=", clusterQuotas:"=", project:"=", pods:"=", alerts:"=" }, templateUrl:"views/directives/deployment-donut.html", controller:[ "$scope", function(b) { var c = !1; b.$watch("rc.spec.replicas", function() { c || (b.desiredReplicas = null); }); var h = function() { f.getHPAWarnings(b.rc, b.hpa, b.limitRanges, b.project).then(function(a) { b.hpaWarnings = _.map(a, function(a) { return _.escape(a.message); }).join("
"); }); }; b.$watchGroup([ "limitRanges", "hpa", "project" ], h), b.$watch("rc.spec.template.spec.containers", h, !0); var l = function() { if (_.get(b.rc, "spec.replicas", 1) > _.get(b.rc, "status.replicas", 0)) { var a = g.filterQuotasForResource(b.rc, b.quotas), c = g.filterQuotasForResource(b.rc, b.clusterQuotas), d = function(a) { return !!g.getResourceLimitAlerts(b.rc, a).length; }; b.showQuotaWarning = _.some(a, d) || _.some(c, d); } else b.showQuotaWarning = !1; }; b.$watchGroup([ "rc.spec.replicas", "rc.status.replicas", "quotas", "clusterQuotas" ], l); var m = function(c) { b.alerts = b.alerts || {}, b.desiredReplicas = null, b.alerts.scale = { type:"error", message:"An error occurred scaling the deployment.", details:a("getErrorDetails")(c) }; }, n = function() { return b.deploymentConfig || b.deployment || b.rc; }, o = function() { if (c = !1, angular.isNumber(b.desiredReplicas)) { var a = n(); return e.scale(a, b.desiredReplicas).then(_.noop, m); } }, p = _.debounce(o, 650); b.viewPodsForDeployment = function(a) { 0 !== j(b.pods) && (1 === j(b.pods) ? i.toResourceURL(_.sample(b.pods)) :i.toPodsForDeployment(a)); }, b.scaleUp = function() { b.scalable && (b.desiredReplicas = b.getDesiredReplicas(), b.desiredReplicas++, p(), c = !0); }, b.scaleDown = function() { if (b.scalable && (b.desiredReplicas = b.getDesiredReplicas(), 0 !== b.desiredReplicas)) { if (1 === b.desiredReplicas) { var a = d.open({ animation:!0, templateUrl:"views/modals/confirmScale.html", controller:"ConfirmScaleController", resolve:{ resource:function() { return b.rc; }, type:function() { return k(b.rc) ? "deployment" :"replication controller"; } } }); return void a.result.then(function() { b.desiredReplicas = b.getDesiredReplicas() - 1, p(), c = !0; }); } b.desiredReplicas--, p(); } }, b.getDesiredReplicas = function() { return angular.isDefined(b.desiredReplicas) && null !== b.desiredReplicas ? b.desiredReplicas :b.rc && b.rc.spec && angular.isDefined(b.rc.spec.replicas) ? b.rc.spec.replicas :1; }, b.$watch(function() { return !_.get(b.rc, "spec.replicas") && !!(b.deploymentConfig ? a("annotation")(b.deploymentConfig, "idledAt") :a("annotation")(b.rc, "idledAt")); }, function(a) { b.isIdled = !!a; }), b.unIdle = function() { b.desiredReplicas = a("unidleTargetReplicas")(b.deploymentConfig || b.rc, b.hpa), o().then(function() { b.isIdled = !1; }, m); }; } ] }; } ]), angular.module("openshiftConsole").directive("quotaUsageChart", [ "$filter", "ChartsService", function(a, b) { return { restrict:"E", scope:{ used:"=", crossProjectUsed:"=?", total:"=", type:"@", height:"=?", width:"=?" }, replace:!0, templateUrl:"views/_quota-usage-chart.html", link:function(c, d) { function e() { var a = _.spread(function(a, c) { b.updateDonutCenterText(d[0], a, c); }); a(h(c.total, c.type, !0)); } var f = a("usageValue"), g = a("usageWithUnits"), h = a("amountAndUnit"); c.height = c.height || 200, c.width = c.width || 175; var i = function(a) { return a ? (100 * Number(a)).toFixed(1) + "%" :"0%"; }; c.chartID = _.uniqueId("quota-usage-chart-"); var j, k = { type:"donut", bindto:"#" + c.chartID, donut:{ label:{ show:!1 }, width:10 }, size:{ height:c.height, width:c.width }, legend:{ show:!0, position:c.legendPosition || "bottom", item:{ onclick:_.noop } }, onrendered:e, tooltip:{ position:function() { return { top:0, left:0 }; }, contents:function(a, b, d, e) { var h = $('
').css({ width:c.width + "px" }), j = $("").appendTo(h), k = $('').appendTo(j); $("").css({ "background-color":e(a[0].id) }).appendTo(k), $("").text(a[0].name).appendTo(k); var l; l = c.total ? i(a[0].value / f(c.total)) + " of " + g(c.total, c.type) :g(c.used, c.type); var m = $("").appendTo(h); return $('').text(l).appendTo(m), h.get(0).outerHTML; } }, data:{ type:"donut", order:null } }, l = function() { var a = void 0 !== c.crossProjectUsed, b = f(c.used) || 0, d = Math.max((f(c.crossProjectUsed) || 0) - b, 0), e = Math.max(f(c.total) - (d + b), 0), g = { columns:[ [ "used", b ], [ "available", e ] ], colors:{ used:e ? "#0088ce" :"#ec7a08", other:e ? "#7dc3e8" :"#f7bd7f", available:"#d1d1d1" }, names:{ used:a ? "Used - This Project" :"Used", other:"Used - Other Projects", available:"Available" } }; a && g.columns.splice(1, 0, [ "other", d ]), j ? j.load(g) :(_.assign(k.data, g), j = c3.generate(k)); }; c.$watchGroup([ "used", "total", "crossProjectUsed" ], _.debounce(l, 300)); } }; } ]), angular.module("openshiftConsole").directive("buildTrendsChart", [ "$filter", "$location", "$rootScope", "$timeout", "BuildsService", function(a, b, c, d, e) { return { restrict:"E", scope:{ builds:"=" }, templateUrl:"views/_build-trends-chart.html", link:function(f) { var g, h = [ "Complete", "Failed", "Cancelled", "Error" ]; f.minBuilds = _.constant(4); var i = function(a) { var b = [], c = moment.duration(a), d = Math.floor(c.asHours()), e = c.minutes(), f = c.seconds(); return d || e || f ? (d && b.push(d + "h"), e && b.push(e + "m"), d || b.push(f + "s"), b.join(" ")) :""; }; f.chartID = _.uniqueId("build-trends-chart-"); var j, k, l = _.constant(350), m = { bindto:"#" + f.chartID, padding:{ right:30, left:80 }, axis:{ x:{ fit:!0, label:{ text:"Build Number", position:"outer-right" }, tick:{ culling:!0, format:function(a) { return "#" + g.json[a].buildNumber; }, width:30 }, type:"category" }, y:{ label:{ text:"Duration", position:"outer-top" }, min:0, padding:{ bottom:0 }, tick:{ format:i } } }, bar:{ width:{ max:50 } }, legend:{ item:{ onclick:_.noop } }, size:{ height:250 }, tooltip:{ format:{ title:function(a) { var b = g.json[a], c = e.getStartTimestsamp(b.build); return "#" + b.buildNumber + " (" + moment(c).fromNow() + ")"; } } }, transition:{ duration:l() }, data:{ colors:{ Cancelled:"#d1d1d1", Complete:"#00b9e4", Error:"#393f44", Failed:"#cc0000" }, empty:{ label:{ text:"No Completed Builds" } }, onclick:function(d) { var e = g.json[d.x].build, f = a("navigateResourceURL")(e); f && c.$apply(function() { b.path(f); }); }, selection:{ enabled:!0 }, type:"bar" } }, n = function() { f.completeBuilds = []; var b = a("isIncompleteBuild"); angular.forEach(f.builds, function(a) { b(a) || f.completeBuilds.push(a); }); }, o = function() { return n(), f.completeBuilds.length; }, p = !1, q = function() { k && p ? j.ygrids([ { value:k, "class":"build-trends-avg-line" } ]) :j.ygrids.remove(); }; f.toggleAvgLine = function() { p = !p, q(); }; var r = function() { g = { json:[], keys:{ x:"buildNumber" } }; var a = 0, b = 0; angular.forEach(f.completeBuilds, function(c) { var d = e.getBuildNumber(c); if (d) { var f = e.getDuration(c); a += f, b++; var h = { buildNumber:d, phase:c.status.phase, build:c }; h[c.status.phase] = f, g.json.push(h); } }), g.json.sort(function(a, b) { return a.buildNumber - b.buildNumber; }), g.json.length > 50 && (g.json = g.json.slice(g.json.length - 50)); var c = {}; angular.forEach(g.json, function(a) { c[a.phase] = !0; }), b ? (k = a / b, f.averageDurationText = i(k)) :(k = null, f.averageDurationText = null); var n = [], o = []; angular.forEach(h, function(a) { c[a] ? n.push(a) :o.push(a); }), g.keys.value = n, g.groups = [ n ], j ? (g.unload = o, g.done = function() { setTimeout(function() { j.flush(); }, l() + 25); }, j.load(g), q()) :(m.data = angular.extend(g, m.data), d(function() { j = c3.generate(m), q(); })); }; f.$watch(o, r), f.$on("destroy", function() { j && (j = j.destroy()); }); } }; } ]), angular.module("openshiftConsole").directive("computeResource", [ "$filter", function(a) { return { restrict:"E", require:"ngModel", scope:{ label:"@", type:"@", description:"@", defaultValue:"=", limitRangeMin:"=", limitRangeMax:"=", maxLimitRequestRatio:"=", request:"=" }, templateUrl:"views/_compute-resource.html", link:function(b, c, d, e) { var f = a("usageValue"), g = a("amountAndUnit"), h = a("humanizeUnit"); b.id = _.uniqueId("compute-resource-"); var i = function(a) { _.some(b.units, { value:a }) || b.units.push({ value:a, label:h(a, b.type) }); }; switch (b.$watch("defaultValue", function(a) { var c = _.spread(function(a, c) { b.placeholder = a, i(c), b.amount || (b.unit = c); }); a && c(g(a, b.type)); }), b.type) { case "cpu": b.unit = "m", b.units = [ { value:"m", label:"millicores" }, { value:"", label:"cores" } ]; break; case "memory": b.unit = "Mi", b.units = [ { value:"M", label:"MB" }, { value:"G", label:"GB" }, { value:"Mi", label:"MiB" }, { value:"Gi", label:"GiB" } ]; } var j = function() { var a = b.amount && f(b.amount + b.unit), c = b.limitRangeMin && f(b.limitRangeMin), d = b.limitRangeMax && f(b.limitRangeMax), e = !0, g = !0; a && c && (e = a >= c), a && d && (g = a <= d), b.form.amount.$setValidity("limitRangeMin", e), b.form.amount.$setValidity("limitRangeMax", g); }, k = function() { var a, c = b.request && f(b.request), d = !0, e = !0; b.amount ? a = f(b.amount + b.unit) :b.defaultValue && (a = f(b.defaultValue)), c && a && (d = a >= c, b.maxLimitRequestRatio && (e = a / c <= b.maxLimitRequestRatio)), c && !a && b.maxLimitRequestRatio && (e = !1), b.form.amount.$setValidity("limitLargerThanRequest", d), b.form.amount.$setValidity("limitWithinRatio", e); }; e.$render = function() { var a = _.spread(function(a, c) { a ? (b.amount = Number(a), b.unit = c, i(c)) :b.amount = null; }); a(g(e.$viewValue, b.type)); }, b.$watchGroup([ "amount", "unit" ], function() { j(), k(), b.amount ? e.$setViewValue(b.amount + b.unit) :e.$setViewValue(void 0); }), b.$watchGroup([ "limitRangeMin", "limitRangeMax" ], j), b.$watch("request", k); } }; } ]).directive("editRequestLimit", [ "$filter", "LimitRangesService", "ModalsService", function(a, b, c) { return { restrict:"E", scope:{ resources:"=", type:"@", limitRanges:"=", project:"=" }, templateUrl:"views/_edit-request-limit.html", link:function(a) { a.showComputeUnitsHelp = function() { c.showComputeUnitsHelp(); }, a.$watch("limitRanges", function() { a.limits = b.getEffectiveLimitRange(a.limitRanges, a.type, "Container", a.project), a.requestCalculated = b.isRequestCalculated(a.type, a.project), a.limitCalculated = b.isLimitCalculated(a.type, a.project); }, !0); } }; } ]), angular.module("openshiftConsole").directive("editProbe", function() { return { restrict:"E", scope:{ probe:"=", exposedPorts:"=" }, templateUrl:"views/directives/_edit-probe.html", link:function(a) { a.id = _.uniqueId("edit-probe-"), a.probe = a.probe || {}, a.types = [ { id:"httpGet", label:"HTTP" }, { id:"exec", label:"Container Command" }, { id:"tcpSocket", label:"TCP Socket" } ], a.previousProbes = {}, a.tcpPorts = _.filter(a.exposedPorts, { protocol:"TCP" }); var b = _.get(a, "probe.httpGet.port") || _.get(a, "probe.exec.port"); b && !_.some(a.tcpPorts, { containerPort:b }) && (a.tcpPorts = [ { containerPort:b, protocol:"TCP" } ].concat(a.tcpPorts)), a.portOptions = a.tcpPorts; var c, d = function(b, c) { if (a.probe = a.probe || {}, a.previousProbes[c] = a.probe[c], delete a.probe[c], a.probe[b] = a.previousProbes[b], !a.probe[b]) switch (b) { case "httpGet": case "tcpSocket": var d = _.head(a.tcpPorts); a.probe[b] = { port:d ? d.containerPort :"" }; break; case "exec": a.probe = { exec:{ command:[] } }; } }; a.probe.httpGet ? c = "httpGet" :a.probe.exec ? c = "exec" :a.probe.tcpSocket ? c = "tcpSocket" :(c = "httpGet", d("httpGet")), _.set(a, "selected.type", c), a.$watch("selected.type", function(a, b) { a !== b && d(a, b); }), a.refreshPorts = function(b) { if (/^\d+$/.test(b)) { var c = a.tcpPorts; b = parseInt(b, 10), b && !_.some(c, { containerPort:b }) && (c = [ { containerPort:b, protocol:"TCP" } ].concat(c)), a.portOptions = _.uniq(c); } }; } }; }), angular.module("openshiftConsole").directive("editCommand", [ "$filter", function(a) { return { restrict:"E", scope:{ args:"=", isRequired:"=" }, templateUrl:"views/directives/_edit-command.html", link:function(b) { b.id = _.uniqueId("edit-command-"), b.input = {}; var c, d, e = a("isMultiline"); b.$watch("args", function() { return d ? void (d = !1) :void (_.isEmpty(b.args) || (b.input.args = _.map(b.args, function(a) { return { value:a, multiline:e(a) }; }), c = !0)); }, !0), b.$watch("input.args", function(a, e) { if (a !== e) { if (c) return void (c = !1); d = !0, b.args = _.map(b.input.args, function(a) { return a.value; }), b.form.command.$setDirty(); } }, !0), b.addArg = function() { b.nextArg && (b.input.args = b.input.args || [], b.input.args.push({ value:b.nextArg, multiline:e(b.nextArg) }), b.nextArg = ""); }, b.removeArg = function(a) { b.input.args.splice(a, 1), _.isEmpty(b.input.args) && (b.input.args = null); }, b.clear = function() { b.input.args = null; }; } }; } ]), angular.module("openshiftConsole").directive("buildPipeline", [ "$filter", "Logger", function(a, b) { return { restrict:"E", scope:{ build:"=", collapseStagesOnCompletion:"=?", buildConfigNameOnExpanded:"=?" }, replace:!0, templateUrl:"views/directives/build-pipeline.html", link:function(c) { var d = a("annotation"); c.$watch(function() { return d(c.build, "jenkinsStatus"); }, function(a) { if (a) try { c.jenkinsStatus = JSON.parse(a); } catch (d) { b.error("Could not parse Jenkins status as JSON", a); } }); var e = a("buildConfigForBuild"); c.$watch(function() { return e(c.build); }, function(a) { c.buildConfigName = a; }); } }; } ]).directive("pipelineStatus", function() { return { restrict:"E", scope:{ status:"=" }, templateUrl:"views/directives/pipeline-status.html" }; }), angular.module("openshiftConsole").directive("buildStatus", function() { return { restrict:"E", scope:{ build:"=" }, templateUrl:"views/directives/build-status.html" }; }), angular.module("openshiftConsole").directive("serviceGroupNotifications", [ "$filter", "APIService", "DeploymentsService", "Navigate", function(a, b, c, d) { return { restrict:"E", scope:!0, templateUrl:"views/directives/service-group-notifications.html", link:function(e) { var f = function(a) { var b = _.get(e, "service.metadata.namespace"); return "hide/alert/" + b + "/" + a; }, g = function(a) { var b = f(a); return "true" === localStorage.getItem(b); }, h = function(a) { var b = f(a); localStorage.setItem(b, "true"); }, i = a("annotation"), j = a("deploymentStatus"), k = a("hasHealthChecks"), l = e.alerts = {}, m = [], n = a("canI"), o = function(a) { var c = "health_checks_" + a.metadata.uid; if (k(a.spec.template)) delete l[c]; else { if (g(c)) return; l[c] = { type:"info", message:a.metadata.name + " has containers without health checks, which ensure your application is running correctly.", onClose:function() { h(c); } }; var e = b.objectToResourceGroupVersion(a); n(e, "update") && (l[c].links = [ { href:d.healthCheckURL(a.metadata.namespace, a.kind, a.metadata.name, e.group), label:"Add Health Checks" } ]); } }, p = function(a) { c.startLatestDeployment(a, { namespace:a.metadata.namespace }, e); }, q = function(a) { var b = _.get(a, "metadata.name"), c = _.get(e, [ "mostRecentReplicationControllerByDC", b ]); if (c) { var f, g = j(c), h = i(c, "deploymentVersion"), k = h ? b + " #" + h :c.metadata.name, m = d.resourceURL(c); switch (g) { case "Cancelled": l[c.metadata.uid + "-cancelled"] = { type:"info", message:"Deployment " + k + " was cancelled.", links:[ { href:m, label:"View Deployment" }, { label:"Start New Deployment", onClick:function() { return p(a), !0; } } ] }; break; case "Failed": f = URI(m).addSearch({ tab:"logs" }).toString(), l[c.metadata.uid + "-failed"] = { type:"error", message:"Deployment " + k + " failed.", reason:i(c, "openshift.io/deployment.status-reason"), links:[ { href:f, label:"View Log" }, { href:"project/" + c.metadata.namespace + "/browse/events", label:"View Events" } ] }; } } }, r = function() { _.each(m, function(a) { var b = _.get(a, "metadata.name", ""), c = _.get(e, [ "deploymentsByService", b ]); _.each(c, o); var d = _.get(e, [ "deploymentConfigsByService", b ]); _.each(d, function(a) { o(a), q(a); }); }); }, s = function(a) { var b = _.get(a, "metadata.uid"); return _.get(e, [ "podsByOwnerUID", b ], {}); }, t = a("groupedPodWarnings"), u = function() { var a = {}; _.each(l, function(a, b) { b.indexOf("pod_warning") >= 0 && delete a[b]; }), _.each(m, function(b) { var c = _.get(b, "metadata.name", ""), d = _.get(e, [ "replicationControllersByService", c ]); _.each(d, function(b) { var c = s(b); t(c, a); }); var f = _.get(e, [ "replicaSetsByService", c ]); _.each(f, function(b) { var c = s(b); t(c, a); }); var g = _.get(e, [ "petSetsByService", c ]); _.each(g, function(b) { var c = s(b); t(c, a); }); }), _.each(a, function(a, b) { var c = _.head(a); if (c) { var f = "pod_warning" + b, i = { type:c.severity || "warning", message:c.message }; switch (c.reason) { case "NonZeroExit": var j = d.resourceURL(c.pod, "Pod", e.service.metadata.namespace), k = URI(j).addSearch({ tab:"logs", container:c.container }).toString(); i.links = [ { href:k, label:"View Log" } ]; break; case "NonZeroExitTerminatingPod": if (g(f)) return; i.links = [ { href:"", label:"Don't Show Me Again", onClick:function() { return h(f), !0; } } ]; } l[f] = i; } }); }; e.showAlert = function(a) { return !e.collapse || "info" !== a.type; }, e.$watchGroup([ "service", "childServices" ], function() { m = (e.childServices || []).concat([ e.service ]), r(), u(); }), e.$watchGroup([ "deploymentConfigsByService", "deploymentsByService" ], r), e.$watchGroup([ "podsByOwnerUid", "replicationControllersByService", "replicaSetsByService", "petSetsByService" ], u); } }; } ]), angular.module("openshiftConsole").directive("overviewService", [ "$filter", "DeploymentsService", "MetricsService", function(a, b, c) { return { restrict:"E", scope:!0, templateUrl:"views/overview/_service.html", link:function(b) { window.OPENSHIFT_CONSTANTS.DISABLE_OVERVIEW_METRICS || c.isAvailable(!0).then(function(a) { b.showMetrics = a; }); var d = a("annotation"), e = a("orderObjectsByDate"), f = function(a) { return _.get(a, "status.replicas") || !d(a, "deployment.kubernetes.io/revision"); }; b.$watch("replicaSetsByService", function(a) { var c = _.get(b, "service.metadata.name"), d = _.get(a, [ c ], {}); b.visibleReplicaSets = e(_.filter(d, f), !0); }); var g = function() { var a = _.get(b, "service.metadata.name"), c = _.get(b, [ "petSetsByService", a ], {}), d = _.get(b, [ "monopodsByService", a ], {}), e = 0; _.each(b.visibleReplicaSetsByDeployment, function(a, b) { b ? e++ :e += _.size(a); }), b.tileCount = _.size(b.deploymentConfigs) + _.size(b.replicationControllers) + _.size(c) + _.size(d) + e; }; b.$watch("vanillaReplicationControllersByService", function(a) { var c = _.get(b, "service.metadata.name"); b.replicationControllers = _.get(a, [ c ], {}), g(); }), b.$watch("deploymentConfigsByService", function(a) { var c = _.get(b, "service.metadata.name"); b.deploymentConfigs = _.get(a, c, {}), g(); }), b.$watch("visibleRSByDeploymentAndService", function(a) { var c = _.get(b, "service.metadata.name"); b.visibleReplicaSetsByDeployment = _.get(a, [ c ], {}), g(); }); } }; } ]), angular.module("openshiftConsole").directive("overviewServiceGroup", [ "$filter", "$uibModal", "RoutesService", "ServicesService", function(a, b, c, d) { return { restrict:"E", scope:!0, templateUrl:"views/overview/_service-group.html", link:function(e) { var f = function() { var a = _.get(e, "service.metadata.uid"); return a ? "collapse/service/" + a :null; }, g = function() { var a = f(); return !!a && "true" === localStorage.getItem(a); }, h = function() { var a = f(); if (a) { var b = e.collapse ? "true" :"false"; localStorage.setItem(a, b); } }; e.collapse = g(), e.toggleCollapse = function(a) { a && a.target && "A" === a.target.tagName || (e.collapse = !e.collapse, h()); }, e.linkService = function() { var c = b.open({ animation:!0, templateUrl:"views/modals/link-service.html", controller:"LinkServiceModalController", scope:e }); c.result.then(function(b) { d.linkService(e.service, b).then(_.noop, function(b) { e.alerts = e.alerts || {}, e.alerts["link-service"] = { type:"error", message:"Could not link services.", details:a("getErrorDetails")(b) }; }); }); }, e.removeLink = function(c) { var f = b.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { message:"Remove service '" + c.metadata.name + "' from group?", details:"Services '" + e.primaryService.metadata.name + "' and '" + c.metadata.name + "' will no longer be displayed together on the overview.", okButtonText:"Remove", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }; } } }); f.result.then(function() { d.removeServiceLink(e.primaryService, c).then(_.noop, function(b) { e.alerts = e.alerts || {}, e.alerts["remove-service-link"] = { type:"error", message:"Could not remove service link.", details:a("getErrorDetails")(b) }; }); }); }, e.$watch("service.metadata.labels.app", function(a) { e.appName = a; }); var i = function(a) { var b; return _.each(a, function(a) { return b ? void (b = c.getPreferredDisplayRoute(b, a)) :void (b = a); }), b; }, j = function() { e.weightByService = {}, e.alternateServices = [], e.totalWeight = 0; var a = _.get(e.displayRoute, "spec.to.weight"); e.weightByService[e.service.metadata.name] = a, e.totalWeight += a; var b = _.get(e.displayRoute, "spec.alternateBackends", []); _.each(b, function(a) { if ("Service" === a.kind) { var b = e.services[a.name]; b && e.alternateServices.push(b), e.weightByService[a.name] = a.weight, e.totalWeight += a.weight; } }); }; e.$watch(function() { var a = _.get(e, "service.metadata.name"); return _.get(e, [ "routesByService", a ]); }, function(a) { e.displayRoute = i(a), e.primaryServiceRoutes = a, j(); }), e.$watchGroup([ "service", "childServicesByParent" ], function() { e.service && (e.primaryService = e.service, e.childServices = _.get(e, [ "childServicesByParent", e.service.metadata.name ], [])); }), e.$watchGroup([ "service", "childServices", "alternateServices" ], function() { var a = [ e.service ].concat(e.alternateServices).concat(e.childServices); e.allServicesInGroup = _.uniq(a, "metadata.uid"); }); } }; } ]), angular.module("openshiftConsole").directive("overviewPod", [ "$filter", "$location", "MetricsService", "Navigate", function(a, b, c, d) { return { restrict:"E", scope:!0, templateUrl:"views/overview/_pod.html", link:function(a) { window.OPENSHIFT_CONSTANTS.DISABLE_OVERVIEW_METRICS || c.isAvailable(!0).then(function(b) { a.showMetrics = b; }), a.viewPod = function() { var c = d.resourceURL(a.pod); b.url(c); }; } }; } ]), angular.module("openshiftConsole").directive("overviewSet", function() { return { restrict:"E", scope:!0, templateUrl:"views/overview/_set.html" }; }), angular.module("openshiftConsole").directive("overviewDeploymentConfig", [ "$filter", "$uibModal", "BuildsService", "DeploymentsService", "Navigate", function(a, b, c, d, e) { return { restrict:"E", scope:!0, templateUrl:"views/overview/_dc.html", link:function(f) { var g = a("orderObjectsByDate"), h = a("deploymentIsInProgress"); f.$watch("scalableReplicationControllerByDC", function() { var a = _.get(f, "deploymentConfig.metadata.name"); f.activeReplicationController = _.get(f, [ "scalableReplicationControllerByDC", a ]); }), f.$watch("visibleRCByDC", function(a) { var b = _.get(f, "deploymentConfig.metadata.name"), c = _.get(a, [ b ], []); f.orderedReplicationControllers = g(c, !0), f.inProgressDeployment = _.find(f.orderedReplicationControllers, h); }), f.$watch("deploymentConfig", function(a) { var b = _.get(a, "spec.triggers", []); f.imageChangeTriggers = _.filter(b, function(a) { return "ImageChange" === a.type && _.get(a, "imageChangeParams.automatic"); }); }), f.urlForImageChangeTrigger = function(b) { var c = a("stripTag")(_.get(b, "imageChangeParams.from.name")), d = _.get(b, "imageChangeParams.from.namespace", f.deploymentConfig.metadata.namespace); return e.resourceURL(c, "ImageStream", d); }, f.startPipeline = function(b) { c.startBuild(b.metadata.name, { namespace:b.metadata.namespace }).then(_.noop, function(b) { f.alerts["start-pipeline"] = { type:"error", message:"An error occurred while starting the pipeline.", details:a("getErrorDetails")(b) }; }); }, f.startDeployment = function() { d.startLatestDeployment(f.deploymentConfig, { namespace:f.deploymentConfig.metadata.namespace }, f); }; var i; f.$watch("deploymentConfig.spec.paused", function() { i = !1; }), f.resumeDeployment = function() { i || (i = !0, d.setPaused(f.deploymentConfig, !1, { namespace:f.deploymentConfig.metadata.namespace }).then(_.noop, function(b) { i = !1, f.alerts["resume-deployment"] = { type:"error", message:"An error occurred resuming the deployment.", details:a("getErrorDetails")(b) }; })); }, f.cancelDeployment = function() { var a = f.inProgressDeployment; if (a) { var c = a.metadata.name, e = _.get(f, "deploymentConfig.status.latestVersion"), g = b.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { message:"Cancel deployment " + c + "?", details:e ? "This will attempt to stop the in-progress deployment and rollback to the previous deployment, #" + e + ". It may take some time to complete." :"This will attempt to stop the in-progress deployment and may take some time to complete.", okButtonText:"Yes, cancel", okButtonClass:"btn-danger", cancelButtonText:"No, don't cancel" }; } } }); g.result.then(function() { var a = _.get(f, [ "replicationControllersByName", c ]); return a ? h(a) ? void d.cancelRunningDeployment(a, f.projectContext, f) :void (f.alerts["cancel-deployment"] = { type:"error", message:"Deployment " + c + " is no longer in progress." }) :void (f.alerts["cancel-deployment"] = { type:"error", message:"Deployment " + c + " no longer exists." }); }); } }; } }; } ]), angular.module("openshiftConsole").directive("overviewDeployment", [ "$filter", "DeploymentsService", function(a, b) { return { restrict:"E", scope:!0, templateUrl:"views/overview/_deployment.html", link:function(c) { var d; c.$watch("deployment.spec.paused", function() { d = !1; }), c.resumeDeployment = function() { d || (d = !0, b.setPaused(c.deployment, !1, { namespace:c.deployment.metadata.namespace }).then(_.noop, function(b) { d = !1, c.alerts["resume-deployment"] = { type:"error", message:"An error occurred resuming the deployment.", details:a("getErrorDetails")(b) }; })); }, c.$watch(function() { return _.get(c, [ "deployments", c.deploymentName ]); }, function() { c.deployment = _.get(c, [ "deployments", c.deploymentName ]), c.latestRevision = b.getRevision(c.deployment); }), c.$watch("scalableReplicaSetsByDeployment", function() { c.latestReplicaSet = _.get(c, [ "scalableReplicaSetsByDeployment", c.deploymentName ]); }), c.$watch("replicaSets", function(a) { c.inProgressDeployment = _.chain(a).filter("status.replicas").size() > 1; }); } }; } ]), angular.module("openshiftConsole").directive("imageNames", [ "$filter", "PodsService", function(a, b) { return { restrict:"E", scope:{ podTemplate:"=", pods:"=" }, templateUrl:"views/overview/_image-names.html", link:function(c) { var d = a("imageSHA"), e = function() { var a = _.get(c, "podTemplate.spec.containers[0]"); if (a) { var e = d(a.image); return e ? void (c.imageIDs = [ e ]) :void (c.imageIDs = b.getImageIDs(c.pods, a.name)); } }; c.$watchGroup([ "podTemplate", "pods" ], e); } }; } ]), angular.module("openshiftConsole").directive("istagSelect", [ "DataService", function(a) { return { require:"^form", restrict:"E", scope:{ istag:"=model", selectDisabled:"=", includeSharedNamespace:"=", allowCustomTag:"=" }, templateUrl:"views/directives/istag-select.html", controller:[ "$scope", function(b) { b.isByNamespace = {}, b.isNamesByNamespace = {}; var c = _.get(b, "istag.namespace") && _.get(b, "istag.imageStream") && _.get(b, "istag.tagObject.tag"), d = function(c) { return b.isByNamespace[c] = {}, b.isNamesByNamespace[c] = [], _.contains(b.namespaces, c) ? void a.list("imagestreams", { namespace:c }, function(a) { b.isByNamespace[c] = a.by("metadata.name"), b.isNamesByNamespace[c] = _.keys(b.isByNamespace[c]).sort(), _.contains(b.isNamesByNamespace[c], b.istag.imageStream) || (b.isNamesByNamespace[c] = b.isNamesByNamespace[c].concat(b.istag.imageStream), b.isByNamespace[c][b.istag.imageStream] = { status:{} }), b.isByNamespace[c][b.istag.imageStream].status.tags || (b.isByNamespace[c][b.istag.imageStream].status = { tags:[] }), _.find(b.isByNamespace[c][b.istag.imageStream].status.tags, { tag:b.istag.tagObject.tag }) || b.isByNamespace[c][b.istag.imageStream].status.tags.push({ tag:b.istag.tagObject.tag }); }) :(b.namespaces.push(c), b.isNamesByNamespace[c] = b.isNamesByNamespace[c].concat(b.istag.imageStream), void (b.isByNamespace[c][b.istag.imageStream] = { status:{ tags:[ { tag:b.istag.tagObject.tag } ] } })); }; a.list("projects", {}, function(e) { b.namespaces = _.keys(e.by("metadata.name")).sort(), b.includeSharedNamespace && (b.namespaces = _.uniq([ "openshift" ].concat(b.namespaces))), b.$watch("istag.namespace", function(e) { if (e && !b.isByNamespace[e]) return c ? (d(e), void (c = !1)) :void a.list("imagestreams", { namespace:e }, function(a) { b.isByNamespace[e] = a.by("metadata.name"), _.each(_.keys(b.isByNamespace[e]), function(a) { b.isByNamespace[e][a].status.tags || (b.isByNamespace[e][a].status = { tags:[] }); }), b.isNamesByNamespace[e] = _.keys(b.isByNamespace[e]).sort(); }); }); }), b.getTags = function(a) { b.allowCustomTag && a && !_.find(b.isByNamespace[b.istag.namespace][b.istag.imageStream].status.tags, { tag:a }) && (_.remove(b.isByNamespace[b.istag.namespace][b.istag.imageStream].status.tags, function(a) { return !a.items; }), b.isByNamespace[b.istag.namespace][b.istag.imageStream].status.tags.unshift({ tag:a })); }, b.groupTags = function(a) { return b.allowCustomTag ? a.items ? "Current Tags" :"New Tag" :""; }; } ] }; } ]), angular.module("openshiftConsole").directive("deployImage", [ "$filter", "$q", "$window", "$uibModal", "ApplicationGenerator", "DataService", "ImagesService", "Navigate", "ProjectsService", "QuotaService", "TaskList", "SecretsService", "keyValueEditorUtils", function(a, b, c, d, e, f, g, h, i, j, k, l, m) { return { restrict:"E", scope:{ project:"=", context:"=", alerts:"=" }, templateUrl:"views/directives/deploy-image.html", link:function(c) { function i() { var a = m.mapEntries(m.compactEntries(c.labels)), b = m.mapEntries(m.compactEntries(c.systemLabels)); return g.getResources({ name:c.app.name, image:c["import"].name, namespace:c["import"].namespace, tag:c["import"].tag || "latest", ports:c.ports, volumes:c.volumes, env:m.mapEntries(m.compactEntries(c.env)), labels:_.extend(b, a), pullSecrets:c.pullSecrets }); } c.mode = "istag", c.istag = {}, c.app = {}, c.env = [], c.labels = [], c.systemLabels = [ { name:"app", value:"" } ], c.pullSecrets = [ { name:"" } ], f.list("secrets", { namespace:c.project }, function(a) { var b = l.groupSecretsByType(a), d = _.mapValues(b, function(a) { return _.map(a, "metadata.name"); }); c.secretsByType = _.each(d, function(a) { a.unshift(""); }); }); var n = a("stripTag"), o = a("stripSHA"), p = a("humanizeKind"), q = function(a) { return a.length > 24 ? a.substring(0, 24) :a; }, r = function() { var a = _.last(c["import"].name.split("/")); return a = o(a), a = n(a), a = q(a); }; c.findImage = function() { c.loading = !0, g.findImage(c.imageName, c.context).then(function(a) { if (c["import"] = a, c.loading = !1, "Success" !== _.get(a, "result.status")) return void (c["import"].error = _.get(a, "result.message", "An error occurred finding the image.")); var b = c["import"].image; b && (c.app.name = r(), c.runsAsRoot = g.runsAsRoot(b), c.ports = e.parsePorts(b), c.volumes = g.getVolumes(b), c.createImageStream = !0); }, function(b) { c["import"].error = a("getErrorDetails")(b) || "An error occurred finding the image.", c.loading = !1; }); }, c.$watch("app.name", function() { c.nameTaken = !1, _.set(_.find(c.systemLabels, { name:"app" }), "value", c.app.name); }), c.$watch("mode", function(a, b) { a !== b && (delete c["import"], c.istag = {}); }), c.$watch("istag", function(b, d) { if (b !== d) { if (!b.namespace || !b.imageStream || !b.tagObject) return void delete c["import"]; var h, i = _.get(b, "tagObject.items[0].image"); c.app.name = q(b.imageStream), c["import"] = { name:b.imageStream, tag:b.tagObject.tag, namespace:b.namespace }, i && (h = b.imageStream + "@" + i, c.loading = !0, f.get("imagestreamimages", h, { namespace:b.namespace }).then(function(a) { c.loading = !1, c["import"].image = a.image, c.ports = e.parsePorts(a.image), c.volumes = g.getVolumes(a.image), c.runsAsRoot = !1; }, function(b) { c["import"].error = a("getErrorDetails")(b) || "An error occurred.", c.loading = !1; })); } }, !0); var s, t = function() { var a = { started:"Deploying image " + c.app.name + " to project " + c.project + ".", success:"Deployed image " + c.app.name + " to project " + c.project + ".", failure:"Failed to deploy image " + c.app.name + " to project " + c.project + "." }; k.clear(), k.add(a, {}, c.project, function() { var a = b.defer(); return f.batch(s, c.context).then(function(b) { var d, e = !_.isEmpty(b.failure); e ? (d = _.map(b.failure, function(a) { return { type:"error", message:"Cannot create " + p(a.object.kind).toLowerCase() + ' "' + a.object.metadata.name + '". ', details:a.data.message }; }), d = d.concat(_.map(b.success, function(a) { return { type:"success", message:"Created " + p(a.kind).toLowerCase() + ' "' + a.metadata.name + '" successfully. ' }; }))) :d = [ { type:"success", message:"All resources for image " + c.app.name + " were created successfully." } ], a.resolve({ alerts:d, hasErrors:e }); }), a.promise; }), h.toNextSteps(c.app.name, c.project); }, u = function(a) { var b = d.open({ animation:!0, templateUrl:"views/modals/confirm.html", controller:"ConfirmModalController", resolve:{ modalConfig:function() { return { alerts:a, message:"Problems were detected while checking your application configuration.", okButtonText:"Create Anyway", okButtonClass:"btn-danger", cancelButtonText:"Cancel" }; } } }); b.result.then(t); }, v = function(a) { var b = a.quotaAlerts || [], d = _.filter(b, { type:"error" }); c.nameTaken || d.length ? (c.disableInputs = !1, c.alerts = b) :b.length ? (u(b), c.disableInputs = !1) :t(); }; c.create = function() { c.disableInputs = !0, c.alerts = {}, s = i(); var a = e.ifResourcesDontExist(s, c.project), b = j.getLatestQuotaAlerts(s, c.context), d = function(a) { return c.nameTaken = a.nameTaken, b; }; a.then(d, d).then(v, v); }; } }; } ]), angular.module("openshiftConsole").directive("selector", function() { return { restrict:"E", scope:{ selector:"=" }, templateUrl:"views/directives/selector.html" }; }), angular.module("openshiftConsole").directive("selectContainers", function() { return { restrict:"E", scope:{ containers:"=ngModel", template:"=podTemplate", required:"=ngRequired", helpText:"@?" }, templateUrl:"views/directives/select-containers.html", controller:[ "$scope", function(a) { a.containers = a.containers || {}, a.$watch("containers", function(b) { a.containerSelected = _.some(b, function(a) { return a; }); }, !0); } ] }; }), angular.module("openshiftConsole").filter("duration", function() { return function(a, b, c, d) { function e(a, b, d) { if (0 !== a) return 1 === a ? void (c ? h.push(b) :h.push("1 " + b)) :void h.push(a + " " + d); } if (!a) return a; d = d || 2, b = b || new Date(); var f = moment(b).diff(a); f < 0 && (f = 0); var g = moment.duration(f), h = [], i = g.years(), j = g.months(), k = g.days(), l = g.hours(), m = g.minutes(), n = g.seconds(); return e(i, "year", "years"), e(j, "month", "months"), e(k, "day", "days"), e(l, "hour", "hours"), e(m, "minute", "minutes"), e(n, "second", "seconds"), 1 === h.length && n && 1 === d ? c ? "minute" :"1 minute" :(0 === h.length && h.push("0 seconds"), h.length > d && (h.length = d), h.join(", ")); }; }).filter("ageLessThan", function() { return function(a, b, c) { return moment().subtract(b, c).diff(moment(a)) < 0; }; }).filter("isNewerResource", function() { return function(a, b) { var c = _.get(a, "metadata.creationTimestamp"); if (!c) return !1; var d = _.get(b, "metadata.creationTimestamp"); return !d || c > d; }; }).filter("mostRecent", [ "isNewerResourceFilter", function(a) { return function(b) { var c = null; return _.each(b, function(b) { c && !a(b, c) || (c = b); }), c; }; } ]).filter("orderObjectsByDate", [ "toArrayFilter", function(a) { return function(b, c) { return b = a(b), b.sort(function(a, b) { if (!(a.metadata && a.metadata.creationTimestamp && b.metadata && b.metadata.creationTimestamp)) throw "orderObjectsByDate expects all objects to have the field metadata.creationTimestamp"; return a.metadata.creationTimestamp < b.metadata.creationTimestamp ? c ? 1 :-1 :a.metadata.creationTimestamp > b.metadata.creationTimestamp ? c ? -1 :1 :0; }), b; }; } ]).filter("humanizeDurationValue", function() { return function(a, b) { return moment.duration(a, b).humanize(); }; }).filter("timeOnlyDurationFromTimestamps", [ "timeOnlyDurationFilter", function(a) { return function(b, c) { return b ? (c = c || new Date(), a(moment(c).diff(b))) :b; }; } ]).filter("timeOnlyDuration", function() { return function(a) { var b = [], c = moment.duration(a), d = Math.floor(c.asHours()), e = c.minutes(), f = c.seconds(); return (d < 0 || e < 0 || f < 0) && (d = e = f = 0), d && b.push(d + "h"), e && b.push(e + "m"), d || b.push(f + "s"), b.join(" "); }; }), angular.module("openshiftConsole").filter("uid", function() { return function(a) { return a && a.metadata && a.metadata.uid ? a.metadata.uid :a; }; }).filter("annotationName", function() { var a = { buildConfig:[ "openshift.io/build-config.name" ], deploymentConfig:[ "openshift.io/deployment-config.name" ], deployment:[ "openshift.io/deployment.name" ], pod:[ "openshift.io/deployer-pod.name" ], deployerPod:[ "openshift.io/deployer-pod.name" ], deployerPodFor:[ "openshift.io/deployer-pod-for.name" ], deploymentStatus:[ "openshift.io/deployment.phase" ], deploymentStatusReason:[ "openshift.io/deployment.status-reason" ], deploymentCancelled:[ "openshift.io/deployment.cancelled" ], encodedDeploymentConfig:[ "openshift.io/encoded-deployment-config" ], deploymentVersion:[ "openshift.io/deployment-config.latest-version" ], displayName:[ "openshift.io/display-name" ], description:[ "openshift.io/description" ], buildNumber:[ "openshift.io/build.number" ], buildPod:[ "openshift.io/build.pod-name" ], jenkinsBuildURL:[ "openshift.io/jenkins-build-uri" ], jenkinsLogURL:[ "openshift.io/jenkins-log-url" ], jenkinsStatus:[ "openshift.io/jenkins-status-json" ], idledAt:[ "idling.alpha.openshift.io/idled-at" ], idledPreviousScale:[ "idling.alpha.openshift.io/previous-scale" ] }; return function(b) { return a[b] || null; }; }).filter("labelName", function() { var a = { buildConfig:[ "openshift.io/build-config.name" ], deploymentConfig:[ "openshift.io/deployment-config.name" ] }; return function(b) { return a[b]; }; }).filter("annotation", [ "annotationNameFilter", function(a) { return function(b, c) { if (b && b.metadata && b.metadata.annotations) { if (void 0 !== b.metadata.annotations[c]) return b.metadata.annotations[c]; for (var d = a(c) || [], e = 0; e < d.length; e++) { var f = d[e]; if (void 0 !== b.metadata.annotations[f]) return b.metadata.annotations[f]; } return null; } return null; }; } ]).filter("imageStreamTagAnnotation", function() { return function(a, b, c) { if (c = c || "latest", a && a.spec && a.spec.tags) for (var d = a.spec.tags, e = 0; e < d.length; ++e) { var f = d[e]; if (c === f.name && f.annotations) return f.annotations[b]; } return null; }; }).filter("description", [ "annotationFilter", function(a) { return function(b) { return a(b, "description"); }; } ]).filter("displayName", [ "annotationFilter", function(a) { return function(b, c) { var d = a(b, "displayName"); return d || c ? d :b && b.metadata ? b.metadata.name :null; }; } ]).filter("uniqueDisplayName", [ "displayNameFilter", function(a) { function b(b) { var c = {}; return angular.forEach(b, function(b, d) { var e = a(b); c[e] = (c[e] || 0) + 1; }), c; } return function(c, d) { if (!c) return ""; var e = a(c), f = c.metadata.name; return e !== f && b(d)[e] > 1 ? e + " (" + f + ")" :e; }; } ]).filter("searchProjects", [ "annotationNameFilter", function(a) { return function(b, c) { return _.filter(b, function(b) { return _.includes(b.metadata.name, c) || _.includes(b.metadata.annotations[a("displayName")], c); }); }; } ]).filter("tags", [ "annotationFilter", function(a) { return function(b, c) { c = c || "tags"; var d = a(b, c); return d ? d.split(/\s*,\s*/) :[]; }; } ]).filter("imageStreamTagTags", [ "imageStreamTagAnnotationFilter", function(a) { return function(b, c) { var d = a(b, "tags", c); return d ? d.split(/\s*,\s*/) :[]; }; } ]).filter("imageStreamLastUpdated", function() { return function(a) { var b = a.metadata.creationTimestamp, c = moment(b); return angular.forEach(a.status.tags, function(a) { if (a.items && a.items.length > 0) { var d = moment(a.items[0].created); d.isAfter(c) && (c = d, b = a.items[0].created); } }), b; }; }).filter("label", function() { return function(a, b) { return a && a.metadata && a.metadata.labels ? a.metadata.labels[b] :null; }; }).filter("buildConfigForBuild", [ "annotationFilter", "labelNameFilter", "labelFilter", function(a, b, c) { var d = b("buildConfig"); return function(b) { return a(b, "buildConfig") || c(b, d); }; } ]).filter("icon", [ "annotationFilter", function(a) { return function(b) { var c = a(b, "icon"); return c ? c :""; }; } ]).filter("iconClass", [ "annotationFilter", function(a) { return function(b, c) { var d = a(b, "iconClass"); return d ? d :"template" === c ? "fa fa-clone" :""; }; } ]).filter("imageStreamTagIconClass", [ "imageStreamTagAnnotationFilter", function(a) { return function(b, c) { var d = a(b, "iconClass", c); return d ? d :"fa fa-cube"; }; } ]).filter("imageName", function() { return function(a) { return a ? a.contains(":") ? a.split(":")[1] :a :""; }; }).filter("imageStreamName", function() { return function(a) { if (!a) return ""; var b, c = a.split("@")[0], d = c.split("/"); return 3 === d.length ? (b = d[2].split(":"), d[1] + "/" + b[0]) :2 === d.length ? c :1 === d.length ? (b = c.split(":"), b[0]) :void 0; }; }).filter("stripTag", function() { return function(a) { return a ? a.split(":")[0] :a; }; }).filter("stripSHA", function() { return function(a) { return a ? a.split("@")[0] :a; }; }).filter("imageSHA", function() { return function(a) { if (!a) return a; var b = a.split("@"); return b.length > 1 ? b[1] :""; }; }).filter("imageEnv", function() { return function(a, b) { for (var c = a.dockerImageMetadata.Config.Env, d = 0; d < c.length; d++) { var e = c[d].split("="); if (e[0] === b) return e[1]; } return null; }; }).filter("destinationSourcePair", function() { return function(a) { var b = {}; return angular.forEach(a, function(a) { b[a.sourcePath] = a.destinationDir; }), b; }; }).filter("buildForImage", function() { return function(a, b) { for (var c = _.get(a, "dockerImageMetadata.Config.Env", []), d = 0; d < c.length; d++) { var e = c[d].split("="); if ("OPENSHIFT_BUILD_NAME" === e[0]) return b[e[1]]; } return null; }; }).filter("webhookURL", [ "DataService", function(a) { return function(b, c, d, e) { return a.url({ resource:"buildconfigs/webhooks/" + d + "/" + c.toLowerCase(), name:b, namespace:e }); }; } ]).filter("isWebRoute", [ "routeHostFilter", function(a) { return function(b) { return !!a(b) && "Subdomain" !== _.get(b, "spec.wildcardPolicy"); }; } ]).filter("routeWebURL", [ "routeHostFilter", function(a) { return function(b, c, d) { var e = b.spec.tls && "" !== b.spec.tls.tlsTerminationType ? "https" :"http", f = e + "://" + (c || a(b)); return b.spec.path && !d && (f += b.spec.path), f; }; } ]).filter("routeLabel", [ "RoutesService", "routeHostFilter", "routeWebURLFilter", "isWebRouteFilter", function(a, b, c, d) { return function(e, f, g) { if (d(e)) return c(e, f, g); var h = f || b(e); return h ? ("Subdomain" === _.get(e, "spec.wildcardPolicy") && (h = "*." + a.getSubdomain(e)), g ? h :(e.spec.path && (h += e.spec.path), h)) :""; }; } ]).filter("parameterPlaceholder", function() { return function(a) { return a.generate ? "(generated if empty)" :""; }; }).filter("parameterValue", function() { return function(a) { return !a.value && a.generate ? "(generated)" :a.value; }; }).filter("imageObjectRef", function() { return function(a, b, c) { if (!a) return ""; var d = a.namespace || b || ""; d.length > 0 && (d += "/"); var e = a.kind; if ("ImageStreamTag" === e || "ImageStreamImage" === e) return d + a.name; if ("DockerImage" === e) { var f = a.name; return c && (f = f.substring(f.lastIndexOf("/") + 1)), f; } var g = d + a.name; return g; }; }).filter("orderByDisplayName", [ "displayNameFilter", "toArrayFilter", function(a, b) { return function(c) { var d = b(c); return d.sort(function(b, c) { var d = a(b) || "", e = a(c) || ""; return d.localeCompare(e); }), d; }; } ]).filter("isPodStuck", function() { return function(a) { if ("Pending" !== a.status.phase) return !1; var b = moment().subtract(5, "m"), c = moment(a.metadata.creationTimestamp); return c.isBefore(b); }; }).filter("isContainerLooping", function() { return function(a) { return a.state.waiting && "CrashLoopBackOff" === a.state.waiting.reason; }; }).filter("isContainerFailed", function() { return function(a) { return a.state.terminated && 0 !== a.state.terminated.exitCode; }; }).filter("isContainerUnprepared", function() { return function(a) { if (!a.state.running || a.ready !== !1 || !a.state.running.startedAt) return !1; var b = moment().subtract(5, "m"), c = moment(a.state.running.startedAt); return c.isBefore(b); }; }).filter("isTroubledPod", [ "isPodStuckFilter", "isContainerLoopingFilter", "isContainerFailedFilter", "isContainerUnpreparedFilter", function(a, b, c, d) { return function(e) { if ("Unknown" === e.status.phase) return !0; if (a(e)) return !0; if ("Running" === e.status.phase && e.status.containerStatuses) { var f; for (f = 0; f < e.status.containerStatuses.length; ++f) { var g = e.status.containerStatuses[f]; if (g.state) { if (c(g)) return !0; if (b(g)) return !0; if (d(g)) return !0; } } } return !1; }; } ]).filter("podWarnings", [ "isPodStuckFilter", "isContainerLoopingFilter", "isContainerFailedFilter", "isContainerUnpreparedFilter", "isTerminatingFilter", function(a, b, c, d, e) { return function(f) { var g = []; return "Unknown" === f.status.phase && g.push({ reason:"Unknown", pod:f.metadata.name, message:"The state of the pod could not be obtained. This is typically due to an error communicating with the host of the pod." }), a(f) && g.push({ reason:"Stuck", pod:f.metadata.name, message:"The pod has been stuck in the pending state for more than five minutes." }), "Running" === f.status.phase && f.status.containerStatuses && _.each(f.status.containerStatuses, function(a) { return !!a.state && (c(a) && (e(f) ? g.push({ severity:"error", reason:"NonZeroExitTerminatingPod", pod:f.metadata.name, container:a.name, message:"The container " + a.name + " did not stop cleanly when terminated (exit code " + a.state.terminated.exitCode + ")." }) :g.push({ severity:"warning", reason:"NonZeroExit", pod:f.metadata.name, container:a.name, message:"The container " + a.name + " failed (exit code " + a.state.terminated.exitCode + ")." })), b(a) && g.push({ severity:"error", reason:"Looping", pod:f.metadata.name, container:a.name, message:"The container " + a.name + " is crashing frequently. It must wait before it will be restarted again." }), void (d(a) && g.push({ severity:"warning", reason:"Unprepared", pod:f.metadata.name, container:a.name, message:"The container " + a.name + " has been running for more than five minutes and has not passed its readiness check." }))); }), g.length > 0 ? g :null; }; } ]).filter("groupedPodWarnings", [ "podWarningsFilter", function(a) { return function(b, c) { var d = c || {}; return _.each(b, function(b) { var c = a(b); _.each(c, function(a) { var b = a.reason + (a.container || ""); d[b] = d[b] || [], d[b].push(a); }); }), d; }; } ]).filter("troubledPods", [ "isTroubledPodFilter", function(a) { return function(b) { var c = []; return angular.forEach(b, function(b) { a(b) && c.push(b); }), c; }; } ]).filter("notTroubledPods", [ "isTroubledPodFilter", function(a) { return function(b) { var c = []; return angular.forEach(b, function(b) { a(b) || c.push(b); }), c; }; } ]).filter("projectOverviewURL", [ "Navigate", function(a) { return function(b) { return angular.isString(b) ? a.projectOverviewURL(b) :angular.isObject(b) ? a.projectOverviewURL(b.metadata && b.metadata.name) :a.projectOverviewURL(""); }; } ]).filter("createFromSourceURL", function() { return function(a, b) { var c = URI.expand("project/{project}/catalog/images{?q*}", { project:a, q:{ builderfor:b } }); return c.toString(); }; }).filter("createFromImageURL", [ "Navigate", function(a) { return function(b, c, d, e) { return a.createFromImageURL(b, c, d, e); }; } ]).filter("createFromTemplateURL", [ "Navigate", function(a) { return function(b, c, d) { return a.createFromTemplateURL(b, c, d); }; } ]).filter("failureObjectName", function() { return function(a) { if (!a.data || !a.data.details) return null; var b = a.data.details; return b.kind ? b.id ? b.kind + " " + b.id :b.kind :b.id; }; }).filter("isIncompleteBuild", [ "ageLessThanFilter", function(a) { return function(a) { if (!a || !a.status || !a.status.phase) return !1; switch (a.status.phase) { case "New": case "Pending": case "Running": return !0; default: return !1; } }; } ]).filter("isRecentBuild", [ "ageLessThanFilter", "isIncompleteBuildFilter", function(a, b) { return function(c) { if (!(c && c.status && c.status.phase && c.metadata)) return !1; if (b(c)) return !0; var d = c.status.completionTimestamp || c.metadata.creationTimestamp; return a(d, 5, "minutes"); }; } ]).filter("deploymentCauses", [ "annotationFilter", function(a) { return function(b) { if (!b) return []; var c = a(b, "encodedDeploymentConfig"); if (!c) return []; try { var d = $.parseJSON(c); if (!d) return []; switch (d.apiVersion) { case "v1beta1": return d.details.causes; case "v1beta3": case "v1": return d.status.details ? d.status.details.causes :[]; default: return Logger.error('Unknown API version "' + d.apiVersion + '" in encoded deployment config for deployment ' + b.metadata.name), d.status && d.status.details && d.status.details.causes ? d.status.details.causes :[]; } } catch (e) { return Logger.error("Failed to parse encoded deployment config", e), []; } }; } ]).filter("desiredReplicas", function() { return function(a) { return a && a.spec ? void 0 === a.spec.replicas ? 1 :a.spec.replicas :0; }; }).filter("serviceImplicitDNSName", function() { return function(a) { return a && a.metadata && a.metadata.name && a.metadata.namespace ? a.metadata.name + "." + a.metadata.namespace + ".svc" :""; }; }).filter("podsForPhase", function() { return function(a, b) { var c = []; return angular.forEach(a, function(a) { a.status.phase === b && c.push(a); }), c; }; }).filter("numContainersReady", function() { return function(a) { var b = 0; return angular.forEach(a.status.containerStatuses, function(a) { a.ready && b++; }), b; }; }).filter("numContainerRestarts", function() { return function(a) { var b = 0; return angular.forEach(a.status.containerStatuses, function(a) { b += a.restartCount; }), b; }; }).filter("isTerminating", function() { return function(a) { return _.has(a, "metadata.deletionTimestamp"); }; }).filter("isPullingImage", function() { return function(a) { if (!a) return !1; var b = _.get(a, "status.phase"); if ("Pending" !== b) return !1; var c = _.get(a, "status.containerStatuses"); if (!c) return !1; var d = function(a) { return "ContainerCreating" === _.get(a, "state.waiting.reason"); }; return _.some(c, d); }; }).filter("newestResource", function() { return function(a) { var b = null; return angular.forEach(a, function(a) { if (b) moment(b.metadata.creationTimestamp).isBefore(a.metadata.creationTimestamp) && (b = a); else { if (!a.metadata.creationTimestamp) return; b = a; } }), b; }; }).filter("deploymentIsLatest", [ "annotationFilter", function(a) { return function(b, c) { if (!c || !b) return !1; var d = parseInt(a(b, "deploymentVersion")), e = c.status.latestVersion; return d === e; }; } ]).filter("deploymentStatus", [ "annotationFilter", "hasDeploymentConfigFilter", function(a, b) { return function(c) { if (a(c, "deploymentCancelled")) return "Cancelled"; var d = a(c, "deploymentStatus"); return !b(c) || "Complete" === d && c.spec.replicas > 0 ? "Active" :d; }; } ]).filter("deploymentIsInProgress", [ "deploymentStatusFilter", function(a) { return function(b) { return [ "New", "Pending", "Running" ].indexOf(a(b)) > -1; }; } ]).filter("anyDeploymentIsInProgress", [ "deploymentIsInProgressFilter", function(a) { return function(b) { return _.some(b, a); }; } ]).filter("hasDeployment", [ "DeploymentsService", function(a) { return function(b) { return !!a.getRevision(b); }; } ]).filter("hasDeploymentConfig", [ "annotationFilter", function(a) { return function(b) { return !!a(b, "deploymentConfig"); }; } ]).filter("getActiveDeployment", [ "DeploymentsService", function(a) { return function(b) { return a.getActiveDeployment(b); }; } ]).filter("isRecentDeployment", [ "deploymentIsLatestFilter", "deploymentIsInProgressFilter", function(a, b) { return function(c, d) { return !!a(c, d) || !!b(c); }; } ]).filter("buildStrategy", function() { return function(a) { if (!a || !a.spec || !a.spec.strategy) return null; switch (a.spec.strategy.type) { case "Source": return a.spec.strategy.sourceStrategy; case "Docker": return a.spec.strategy.dockerStrategy; case "Custom": return a.spec.strategy.customStrategy; case "JenkinsPipeline": return a.spec.strategy.jenkinsPipelineStrategy; default: return null; } }; }).filter("isJenkinsPipelineStrategy", function() { return function(a) { return "JenkinsPipeline" === _.get(a, "spec.strategy.type"); }; }).filter("jenkinsLogURL", [ "annotationFilter", function(a) { return function(b, c) { var d = a(b, "jenkinsLogURL"); return !d || c ? d :d.replace(/\/consoleText$/, "/console"); }; } ]).filter("jenkinsBuildURL", [ "annotationFilter", "jenkinsLogURLFilter", function(a, b) { return function(b) { return a(b, "jenkinsBuildURL"); }; } ]).filter("jenkinsInputURL", [ "jenkinsBuildURLFilter", function(a) { return function(b) { var c = a(b); return c ? new URI(c).segment("/input/").toString() :null; }; } ]).filter("buildLogURL", [ "isJenkinsPipelineStrategyFilter", "jenkinsLogURLFilter", "navigateResourceURLFilter", function(a, b, c) { return function(d) { if (a(d)) return b(d); var e = c(d); return e ? new URI(e).addSearch("tab", "logs").toString() :null; }; } ]).filter("jenkinsfileLink", [ "isJenkinsPipelineStrategyFilter", "githubLinkFilter", function(a, b) { return function(c) { if (!a(c) || _.has(c, "spec.strategy.jenkinsPipelineStrategy.jenkinsfile")) return ""; var d = _.get(c, "spec.source.git.uri"); if (!d) return ""; var e = _.get(c, "spec.source.git.ref"), f = _.get(c, "spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath", "Jenkinsfile"), g = _.get(c, "spec.source.contextDir"); g && (f = URI.joinPaths(g, f).path()); var h = b(d, e, f); return URI(h).is("url") ? h :""; }; } ]).filter("pipelineStageComplete", function() { return function(a) { return !!a && _.indexOf([ "ABORTED", "FAILED", "SUCCESS" ], a.status) !== -1; }; }).filter("pipelineStagePendingInput", function() { return function(a) { return !!a && "PAUSED_PENDING_INPUT" === a.status; }; }).filter("deploymentStrategyParams", function() { return function(a) { var b = _.get(a, "spec.strategy.type"); switch (b) { case "Recreate": return _.get(a, "spec.strategy.recreateParams", {}); case "Rolling": return _.get(a, "spec.strategy.rollingParams", {}); case "Custom": return _.get(a, "spec.strategy.customParams", {}); default: return null; } }; }).filter("humanizeTLSTermination", function() { return function(a) { switch (a) { case "edge": return "Edge"; case "passthrough": return "Passthrough"; case "reencrypt": return "Re-encrypt"; default: return a; } }; }).filter("humanizeKind", [ "startCaseFilter", function(a) { return function(a, b) { if (!a) return a; var c = _.startCase(a); return b ? c :c.toLowerCase(); }; } ]).filter("kindToResource", [ "APIService", function(a) { return a.kindToResource; } ]).filter("abbreviateResource", [ "APIService", function(a) { var b = { buildconfigs:"bc", deploymentconfigs:"dc", horizontalpodautoscalers:"hpa", imagestreams:"is", imagestreamtags:"istag", replicasets:"rs", replicationcontrollers:"rc", services:"svc" }; return function(a) { return b[a] || a; }; } ]).filter("humanizeQuotaResource", function() { return function(a, b) { if (!a) return a; var c = { configmaps:"Config Maps", cpu:"CPU (Request)", "limits.cpu":"CPU (Limit)", "limits.memory":"Memory (Limit)", memory:"Memory (Request)", "openshift.io/imagesize":"Image Size", "openshift.io/imagestreamsize":"Image Stream Size", "openshift.io/projectimagessize":"Project Image Size", persistentvolumeclaims:"Persistent Volume Claims", pods:"Pods", replicationcontrollers:"Replication Controllers", "requests.cpu":"CPU (Request)", "requests.memory":"Memory (Request)", resourcequotas:"Resource Quotas", secrets:"Secrets", services:"Services" }, d = { configmaps:"config maps", cpu:"CPU (request)", "limits.cpu":"CPU (limit)", "limits.memory":"memory (limit)", memory:"memory (request)", "openshift.io/imagesize":"image size", "openshift.io/imagestreamsize":"image stream size", "openshift.io/projectimagessize":"project image size", persistentvolumeclaims:"persistent volume claims", replicationcontrollers:"replication controllers", "requests.cpu":"CPU (request)", "requests.memory":"memory (request)", resourcequotas:"resource quotas" }; return b ? c[a] || a :d[a] || a; }; }).filter("routeTargetPortMapping", [ "RoutesService", function(a) { var b = function(a, b, c) { a = a || "", b = b || ""; var d = "Service Port " + a + " → Container Port " + b; return c && (d += " (" + c + ")"), d; }; return function(c, d) { if (!c.spec.port || !c.spec.port.targetPort || !d) return ""; var e = c.spec.port.targetPort, f = a.getServicePortForRoute(e, d); return f ? b(f.port, f.targetPort, f.protocol) :angular.isString(e) ? b(e, null) :b(null, e); }; } ]).filter("podStatus", function() { return function(a) { if (!a || !a.metadata.deletionTimestamp && !a.status) return ""; if (a.metadata.deletionTimestamp) return "Terminating"; var b = a.status.reason || a.status.phase; return angular.forEach(a.status.containerStatuses, function(a) { var c, d, e = _.get(a, "state.waiting.reason") || _.get(a, "state.terminated.reason"); return e ? void (b = e) :(c = _.get(a, "state.terminated.signal")) ? void (b = "Signal: " + c) :(d = _.get(a, "state.terminated.exitCode"), void (d && (b = "Exit Code: " + d))); }), b; }; }).filter("podStartTime", function() { return function(a) { var b = null; return _.each(_.get(a, "status.containerStatuses"), function(a) { var c = _.get(a, "state.running") || _.get(a, "state.terminated"); c && (b && !moment(c.startedAt).isBefore(b) || (b = c.startedAt)); }), b; }; }).filter("podCompletionTime", function() { return function(a) { var b = null; return _.each(_.get(a, "status.containerStatuses"), function(a) { var c = _.get(a, "state.terminated"); c && (b && !moment(c.finishedAt).isAfter(b) || (b = c.finishedAt)); }), b; }; }).filter("routeIngressCondition", function() { return function(a, b) { return a ? _.find(a.conditions, { type:b }) :null; }; }).filter("routeHost", function() { return function(a) { if (!_.get(a, "status.ingress")) return _.get(a, "spec.host"); if (!a.status.ingress) return a.spec.host; var b = null; return angular.forEach(a.status.ingress, function(a) { _.some(a.conditions, { type:"Admitted", status:"True" }) && (!b || b.lastTransitionTime > a.lastTransitionTime) && (b = a); }), b ? b.host :a.spec.host; }; }).filter("isRequestCalculated", [ "LimitRangesService", function(a) { return function(b, c) { return a.isRequestCalculated(b, c); }; } ]).filter("isLimitCalculated", [ "LimitRangesService", function(a) { return function(b, c) { return a.isLimitCalculated(b, c); }; } ]).filter("hpaCPUPercent", [ "HPAService", "LimitRangesService", function(a, b) { return function(c, d) { return c && b.isRequestCalculated("cpu", d) ? a.convertRequestPercentToLimit(c, d) :c; }; } ]).filter("hasHealthChecks", function() { return function(a) { var b = _.get(a, "spec.containers", []); return _.every(b, function(a) { return a.readinessProbe || a.livenessProbe; }); }; }).filter("scopeDetails", [ "sentenceCaseFilter", function(a) { var b = { Terminating:"Affects pods that have an active deadline. These pods usually include builds, deployers, and jobs.", NotTerminating:"Affects pods that do not have an active deadline. These pods usually include your applications.", BestEffort:"Affects pods that do not have resource limits set. These pods have a best effort quality of service.", NotBestEffort:"Affects pods that have at least one resource limit set. These pods do not have a best effort quality of service." }; return function(c) { return b[c] || a(c); }; } ]).filter("isDebugPod", [ "annotationFilter", function(a) { return function(b) { return !!a(b, "debug.openshift.io/source-resource"); }; } ]).filter("debugPodSourceName", [ "annotationFilter", function(a) { return function(b) { var c = a(b, "debug.openshift.io/source-resource"); if (!c) return ""; var d = c.split("/"); return 2 !== d.length ? (Logger.warn('Invalid debug.openshift.io/source-resource annotation value "' + c + '"'), "") :d[1]; }; } ]).filter("entrypoint", function() { var a = function(a) { return _.isArray(a) ? a.join(" ") :a; }; return function(b, c) { if (!b) return null; var d, e = a(b.command), f = a(b.args); if (e && f) return e + " " + f; if (e) return e; if (c) { if (d = a(_.get(c, "dockerImageMetadata.Config.Entrypoint") || [ "/bin/sh", "-c" ]), f) return d + " " + f; if (e = a(_.get(c, "dockerImageMetadata.Config.Cmd"))) return d + " " + e; } return f ? " " + f :null; }; }).filter("unidleTargetReplicas", [ "annotationFilter", function(a) { return function(b, c) { var d; if (b) try { d = parseInt(a(b, "idledPreviousScale")); } catch (e) { Logger.error("Unable to parse previous scale annotation as a number."); } return d || _.get(_.first(c), "spec.minReplicas") || 1; }; } ]).filter("lastDeploymentRevision", [ "annotationFilter", function(a) { return function(b) { if (!b) return ""; var c = a(b, "deployment.kubernetes.io/revision"); return c ? "#" + c :"Unknown"; }; } ]), angular.module("openshiftConsole").filter("canI", [ "AuthorizationService", function(a) { return function(b, c, d) { return a.canI(b, c, d); }; } ]).filter("canIAddToProject", [ "AuthorizationService", function(a) { return function(b) { return a.canIAddToProject(b); }; } ]).filter("canIDoAny", [ "canIFilter", function(a) { var b = { buildConfigs:[ { group:"", resource:"buildconfigs", verbs:[ "delete", "update" ] }, { group:"", resource:"buildconfigs/instantiate", verbs:[ "create" ] } ], builds:[ { group:"", resource:"builds/clone", verbs:[ "create" ] }, { group:"", resource:"builds", verbs:[ "delete", "update" ] } ], configmaps:[ { group:"", resource:"configmaps", verbs:[ "update", "delete" ] } ], deployments:[ { group:"extensions", resource:"horizontalpodautoscalers", verbs:[ "create", "update" ] }, { group:"extensions", resource:"deployments", verbs:[ "create", "update" ] } ], deploymentConfigs:[ { group:"extensions", resource:"horizontalpodautoscalers", verbs:[ "create", "update" ] }, { group:"", resource:"deploymentconfigs", verbs:[ "create", "update" ] } ], horizontalPodAutoscalers:[ { group:"extensions", resource:"horizontalpodautoscalers", verbs:[ "update", "delete" ] } ], imageStreams:[ { group:"", resource:"imagestreams", verbs:[ "update", "delete" ] } ], persistentVolumeClaims:[ { group:"", resource:"persistentvolumeclaims", verbs:[ "update", "delete" ] } ], pods:[ { group:"", resource:"pods", verbs:[ "update", "delete" ] }, { group:"", resource:"deploymentconfigs", verbs:[ "update" ] } ], replicaSets:[ { group:"extensions", resource:"horizontalpodautoscalers", verbs:[ "create", "update" ] }, { group:"extensions", resource:"replicasets", verbs:[ "update", "delete" ] } ], replicationControllers:[ { group:"", resource:"replicationcontrollers", verbs:[ "update", "delete" ] } ], routes:[ { group:"", resource:"routes", verbs:[ "update", "delete" ] } ], services:[ { group:"", resource:"services", verbs:[ "update", "create", "delete" ] } ], secrets:[ { group:"", resource:"secrets", verbs:[ "update", "delete" ] } ], projects:[ { group:"", resource:"projects", verbs:[ "delete", "update" ] } ] }; return function(c) { return _.some(b[c], function(b) { return _.some(b.verbs, function(c) { return a({ resource:b.resource, group:b.group }, c); }); }); }; } ]).filter("canIScale", [ "canIFilter", "hasDeploymentConfigFilter", "DeploymentsService", function(a, b, c) { return function(b) { var d = c.getScaleResource(b); return a(d, "update"); }; } ]), angular.module("openshiftConsole").filter("underscore", function() { return function(a) { return a.replace(/\./g, "_"); }; }).filter("defaultIfBlank", function() { return function(a, b) { return null === a ? b :("string" != typeof a && (a = String(a)), 0 === a.trim().length ? b :a); }; }).filter("keys", function() { return _.keys; }).filter("hashSize", function() { return function(a) { return a ? Object.keys(a).length :0; }; }).filter("usageValue", function() { return function(a) { if (!a) return a; var b = /(-?[0-9\.]+)\s*(.*)/.exec(a); if (!b) return a; var c = b[1]; c = c.indexOf(".") >= 0 ? parseFloat(c) :parseInt(b[1]); var d = b[2], e = 1; switch (d) { case "E": e = Math.pow(1e3, 6); break; case "P": e = Math.pow(1e3, 5); break; case "T": e = Math.pow(1e3, 4); break; case "G": e = Math.pow(1e3, 3); break; case "M": e = Math.pow(1e3, 2); break; case "K": e = 1e3; break; case "m": e = .001; break; case "Ei": e = Math.pow(1024, 6); break; case "Pi": e = Math.pow(1024, 5); break; case "Ti": e = Math.pow(1024, 4); break; case "Gi": e = Math.pow(1024, 3); break; case "Mi": e = Math.pow(1024, 2); break; case "Ki": e = 1024; } return c * e; }; }).filter("humanizeUnit", function() { return function(a, b, c) { switch (b) { case "memory": case "limits.memory": case "requests.memory": case "storage": return a ? a + "B" :a; case "cpu": case "limits.cpu": case "requests.cpu": "m" === a && (a = "milli"); var d = c ? "core" :"cores"; return (a || "") + d; default: return a; } }; }).filter("amountAndUnit", [ "humanizeUnitFilter", function(a) { return function(b, c, d) { if (!b) return [ b, null ]; var e = /(-?[0-9\.]+)\s*(.*)/.exec(b); if (!e) return [ b, null ]; var f = e[1], g = e[2]; return d && (g = a(g, c, "1" === f)), [ f, g ]; }; } ]).filter("usageWithUnits", [ "amountAndUnitFilter", function(a) { return function(b, c) { var d = _.spread(function(a, b) { return b ? a + " " + b :a; }); return d(a(b, c, !0)); }; } ]).filter("humanizeSize", function() { return function(a) { if (null === a || void 0 === a || "" === a) return a; if (a = Number(a), a < 1024) return a + " bytes"; var b = a / 1024; if (b < 1024) return b.toFixed(1) + " KiB"; var c = b / 1024; if (c < 1024) return c.toFixed(1) + " MiB"; var d = c / 1024; return d.toFixed(1) + " GiB"; }; }).filter("computeResourceLabel", function() { return function(a, b) { switch (a) { case "cpu": return "CPU"; case "memory": return b ? "Memory" :"memory"; default: return a; } }; }).filter("helpLink", [ "Constants", function(a) { return function(b) { var c = a.HELP[b] || a.HELP["default"]; return URI(c).is("absolute") || (c = a.HELP_BASE_URL + c), c; }; } ]).filter("taskTitle", function() { return function(a) { return "completed" !== a.status ? a.titles.started :a.hasErrors ? a.titles.failure :a.titles.success; }; }).filter("httpHttps", function() { return function(a) { return a ? "https://" :"http://"; }; }).filter("isGithubLink", function() { var a = /^(?:https?:\/\/|git:\/\/|git\+ssh:\/\/|git\+https:\/\/)?(?:[^@]+@)?github\.com[:\/]([^\/]+\/[^\/]+?)(\/|(?:\.git(#.*)?))?$/; return function(b) { return b ? a.test(b) :b; }; }).filter("githubLink", function() { return function(a, b, c) { var d = a.match(/^(?:https?:\/\/|git:\/\/|git\+ssh:\/\/|git\+https:\/\/)?(?:[^@]+@)?github\.com[:\/]([^\/]+\/[^\/]+?)(\/|(?:\.git(#.*)?))?$/); return d && (a = "https://github.com/" + d[1], c && "/" === c.charAt(0) && (c = c.substring(1)), c ? (c = encodeURIComponent(c), c = c.replace("%2F", "/"), a += "/tree/" + encodeURIComponent(b || "master") + "/" + c) :b && "master" !== b && (a += "/tree/" + encodeURIComponent(b))), a; }; }).filter("yesNo", function() { return function(a) { return a ? "Yes" :"No"; }; }).filter("valuesIn", function() { return function(a, b) { if (!b) return {}; var c = b.split(","), d = {}; return angular.forEach(a, function(a, b) { c.indexOf(b) !== -1 && (d[b] = a); }), d; }; }).filter("valuesNotIn", function() { return function(a, b) { if (!b) return a; var c = b.split(","), d = {}; return angular.forEach(a, function(a, b) { c.indexOf(b) === -1 && (d[b] = a); }), d; }; }).filter("toArray", function() { return function(a) { if (!a) return []; if (angular.isArray(a)) return a; var b = []; return angular.forEach(a, function(a) { b.push(a); }), b; }; }).filter("stripSHAPrefix", function() { return function(a) { return a ? a.replace(/^sha256:/, "") :a; }; }).filter("limitToOrAll", [ "limitToFilter", function(a) { return function(b, c) { return isNaN(c) ? b :a(b, c); }; } ]).filter("getErrorDetails", [ "upperFirstFilter", function(a) { return function(b, c) { var d = b.data || {}; if (d.message) return c ? a(d.message) :d.message; var e = b.status || d.status; return e ? "Status: " + e :""; }; } ]).filter("humanize", function() { return function(a) { return a.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b([A-Z]+)([A-Z])([a-z])/, "$1 $2$3").replace(/^./, function(a) { return a.toUpperCase(); }); }; }).filter("parseJSON", function() { return function(a) { if (!a) return null; try { var b = JSON.parse(a); return "object" == typeof b ? b :null; } catch (c) { return null; } }; }).filter("prettifyJSON", [ "parseJSONFilter", function(a) { return function(b) { var c = a(b); return c ? JSON.stringify(c, null, 4) :b; }; } ]).filter("navigateResourceURL", [ "Navigate", function(a) { return function(b, c, d, e) { return a.resourceURL(b, c, d, null, { apiVersion:e }); }; } ]).filter("configURLForResource", [ "Navigate", function(a) { return function(b, c) { return a.configURLForResource(b, c); }; } ]).filter("editResourceURL", [ "Navigate", function(a) { return function(b, c, d) { var e = a.resourceURL(b, c, d, "edit"); return e; }; } ]).filter("editYamlURL", [ "Navigate", function(a) { return function(b, c) { return a.yamlURL(b, c); }; } ]).filter("join", function() { return function(a, b) { return b || (b = ","), a.join(b); }; }).filter("generateName", function() { return function(a, b) { a || (a = ""), b || (b = 5); var c = Math.round(Math.pow(36, b + 1) - Math.random() * Math.pow(36, b)).toString(36).slice(1); return a + c; }; }).filter("accessModes", function() { return function(a, b) { if (!a) return a; var c = []; return angular.forEach(a, function(a) { var d, e = "long" === b; switch (a) { case "ReadWriteOnce": d = e ? "RWO (Read-Write-Once)" :"Read-Write-Once"; break; case "ReadOnlyMany": d = e ? "ROX (Read-Only-Many)" :"Read-Only-Many"; break; case "ReadWriteMany": d = e ? "RWX (Read-Write-Many)" :"Read-Write-Many"; break; default: d = a; } c.push(d); }), _.uniq(c); }; }).filter("truncate", function() { return function(a, b, c, d) { if (!a) return a; var e = a; if (b && (e = e.substring(0, b)), d) { var f = a.split("\n", d).join("\n").length; e = e.substring(0, f); } if (c !== !1) { var g = Math.max(4, b - 10), h = e.lastIndexOf(/\s/, g); h !== -1 && (e = e.substring(0, h)); } return e; }; }).filter("middleEllipses", function() { return function(a, b, c) { if (b < 3) return a; if (a.length <= b) return a; c || (c = "..."); var d = Math.floor((b - 1) / 2), e = a.slice(0, d), f = a.slice(a.length - d); return e + c + f; }; }).filter("isNil", function() { return function(a) { return null === a || void 0 === a; }; }).filter("percent", function() { return function(a, b) { return null === a || void 0 === a ? a :_.round(100 * Number(a), b) + "%"; }; }).filter("filterCollection", function() { return function(a, b) { return a && b ? _.filter(a, b) :a; }; }).filter("isAbsoluteURL", function() { return function(a) { if (!a) return !1; var b = new URI(a), c = b.protocol(); return b.is("absolute") && ("http" === c || "https" === c); }; }).filter("altTextForValueFrom", function() { return function(a) { a.value || a.valueFrom && (a.valueIcon = "pficon pficon-help", a.valueIconTooltip = "This is a referenced value that will be generated when a container is created. On running pods you can check the resolved values by going to the Terminal tab and echoing the environment variable.", _.each(a.valueFrom, function(b, c) { switch (c) { case "configMapKeyRef": a.valueAlt = "Set to the key " + b.key + " in config map " + b.name; break; case "secretKeyRef": a.valueAlt = "Set to the key " + b.key + " in secret " + b.name, a.valueIcon = "fa fa-user-secret"; break; case "fieldRef": a.valueAlt = "Set to the field " + b.fieldPath + " in current object"; break; default: a.valueAlt = "Set to a reference on a " + c; } })); }; }).filter("isIE", function() { var a = navigator.userAgent, b = /msie|trident/i.test(a); return function() { return b; }; }).filter("isEdge", function() { var a = navigator.userAgent, b = /chrome.+? edge/i.test(a); return function() { return b; }; }).filter("abs", function() { return function(a) { return Math.abs(a); }; }).filter("highlightKeywords", [ "KeywordService", function(a) { return function(b, c) { if (!b) return b; var d = _.escape(b); if (_.isEmpty(c)) return d; _.isString(c) && (c = a.generateKeywords(c)); var e = _.map(c, function(a) { return _.isRegExp(a) ? a.source :_.escapeRegExp(a); }).join("|"), f = new RegExp("(" + e + ")", "ig"); return d.replace(f, "$&"); }; } ]).filter("encodeURIComponent", function() { return window.encodeURIComponent; }).filter("linkify", [ "HTMLService", function(a) { return function(b, c, d) { return a.linkify(b, c, d); }; } ]), angular.module("openshiftConsole").filter("camelToLower", function() { return function(a) { return a ? _.startCase(a).toLowerCase() :a; }; }).filter("upperFirst", function() { return function(a) { return a ? a.charAt(0).toUpperCase() + a.slice(1) :a; }; }).filter("sentenceCase", [ "camelToLowerFilter", "upperFirstFilter", function(a, b) { return function(c) { if (!c) return c; var d = a(c); return b(d); }; } ]).filter("startCase", function() { return function(a) { return a ? _.startCase(a) :a; }; }).filter("capitalize", function() { return function(a) { return _.capitalize(a); }; }).filter("isMultiline", function() { return function(a, b) { if (!a) return !1; var c = a.search(/\r|\n/); return c !== -1 && (!b || c !== a.length - 1); }; }), angular.module("openshiftConsole").directive("affix", [ "$window", function(a) { return { restrict:"AE", scope:{ offsetTop:"@", offsetBottom:"@" }, link:function(a, b, c, d) { b.affix({ offset:{ top:c.offsetTop, bottom:c.offsetBottom } }); } }; } ]), angular.module("openshiftConsole").factory("logLinks", [ "$anchorScroll", "$document", "$location", "$window", function(a, b, c, d) { var e = function(a) { a ? a.scrollTop = 0 :window.scrollTo(null, 0); }, f = function(a) { a ? a.scrollTop = a.scrollHeight :window.scrollTo(0, document.body.scrollHeight - document.body.clientHeight); }, g = function(b, d) { d.preventDefault(), d.stopPropagation(), c.hash(b), a(b); }, h = function(a, b) { if (b) return void d.open(b, "_blank"); var c = { view:"chromeless" }; a && a.container && (c.container = a.container), c = _.flatten([ c ]); var e = new URI(); _.each(c, function(a) { e.addSearch(a); }), d.open(e.toString(), "_blank"); }, i = _.template([ "/#/discover?", "_g=(", "time:(", "from:now-1w,", "mode:relative,", "to:now", ")", ")", "&_a=(", "columns:!(kubernetes.container_name,message),", "index:'project.<%= namespace %>.<%= namespaceUid %>.*',", "query:(", "query_string:(", "analyze_wildcard:!t,", 'query:\'kubernetes.pod_name:"<%= podname %>" AND kubernetes.namespace_name:"<%= namespace %>"\'', ")", "),", "sort:!('@timestamp',desc)", ")", "#console_container_name=<%= containername %>", "&console_back_url=<%= backlink %>" ].join("")), j = function(a) { return i(a); }; return { scrollTop:e, scrollBottom:f, scrollTo:g, chromelessLink:h, archiveUri:j }; } ]), function() { var a = "javaLinkExtension"; angular.module(a, [ "openshiftConsole" ]).run([ "AuthService", "BaseHref", "DataService", "extensionRegistry", function(a, b, c, d) { var e = [ "
', "
", '', "
", "", "
" ].join(""), f = function(a, b, d) { return new URI(c.url({ resource:"pods/proxy", name:[ "https", b, d || "" ].join(":"), namespace:a })).segment("jolokia/"); }; d.add("container-links", _.spread(function(c, d) { var g = _.find(c.ports || [], function(a) { return a.name && "jolokia" === a.name.toLowerCase(); }); if (g && "Running" === _.get(d, "status.phase")) { var h = d.status.containerStatuses, i = _.find(h, function(a) { return a.name === c.name; }); if (i && i.ready) { var j = d.metadata.name, k = d.metadata.namespace, l = f(k, j, g.containerPort).toString(), m = function(d) { d.preventDefault(), d.stopPropagation(); var e = window.location.href, f = c.name || "Untitled Container", g = a.UserStore().getToken() || "", h = new URI().path(b).segment("java").segment("").hash(g).query({ jolokiaUrl:l, title:f, returnTo:e }); window.location.href = h.toString(); }; return { type:"dom", node:e, onClick:m, url:l }; } } })); } ]), hawtioPluginLoader.addModule(a); }(), angular.module("openshiftConsole").run([ "extensionRegistry", function(a) { a.add("nav-help-dropdown", function() { return [ { type:"dom", node:'
  • Documentation
  • ' }, { type:"dom", node:'
  • Command Line Tools
  • ' }, { type:"dom", node:'
  • About
  • ' } ]; }); } ]), angular.module("openshiftConsole").run([ "extensionRegistry", function(a) { a.add("nav-user-dropdown", function() { return [ { type:"dom", node:'
  • Log out
  • ' } ]; }); } ]), angular.module("openshiftConsole").run([ "extensionRegistry", function(a) { a.add("nav-dropdown-mobile", _.spread(function(a) { return [ { type:"dom", node:[ "
  • ", "", ' Documentation', "", "
  • " ].join("") }, { type:"dom", node:[ "
  • ", '', ' Command Line Tools', "", "
  • " ].join("") }, { type:"dom", node:[ "
  • ", '', ' About', "", "
  • " ].join("") }, { type:"dom", node:_.template([ "
  • ", '', '', 'Log out <%= userName %>', "", "
  • " ].join(""))({ userName:a ? a.fullName || a.metadata.name :"" }) } ]; })); } ]);`) func scriptsScriptsJsBytes() ([]byte, error) { return _scriptsScriptsJs, nil } func scriptsScriptsJs() (*asset, error) { bytes, err := scriptsScriptsJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "scripts/scripts.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _scriptsTemplatesJs = []byte(`angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function($templateCache) { 'use strict'; $templateCache.put('views/_alerts.html', "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{alert.type}}\n" + "{{alert.message}}{{alert.details}}\n" + "\n" + "{{link.label}}\n" + "{{link.label}}\n" + "|\n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_build-trends-chart.html', " \n" + "\n" + "
    \n" + "
    \n" + "Average build duration {{averageDurationText}}\n" + "
    " ); $templateCache.put('views/_cannot-create-project.html', "A cluster admin can create a project for you by running the command\n" + "oadm new-project <projectname> --admin={{user.metadata.name || '<YourUsername>'}}\n" + "" ); $templateCache.put('views/_compute-resource.html', "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{option.label}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "{{description}}\n" + "
    \n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "
    \n" + "Can't be negative.\n" + "
    \n" + "
    \n" + "Can't be less than {{limitRangeMin | usageWithUnits : type}}.\n" + "
    \n" + "
    \n" + "Can't be greater than {{limitRangeMax | usageWithUnits : type}}.\n" + "
    \n" + "
    \n" + "Limit can't be less than request ({{request | usageWithUnits : type}}).\n" + "
    \n" + "
    \n" + "\n" + "Limit is required if request is set. (Max Limit/Request Ratio: {{maxLimitRequestRatio}})\n" + "\n" + "\n" + "Limit cannot be more than {{maxLimitRequestRatio}} times request value. (Request: {{request | usageWithUnits : type}},\n" + "\n" + "Limit: {{(amount ? (amount + unit) : defaultValue) | usageWithUnits : type}})\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_config-file-params.html', "
    \n" + "

    {{serverName}}

    \n" + "
    username
    \n" + "
    {{data.username}}
    \n" + "
    password
    \n" + "
    \n" + "\n" + "
    \n" + "
    *****
    \n" + "
    email
    \n" + "
    {{data.email}}
    \n" + "
    " ); $templateCache.put('views/_deployment-config-metadata.html', "
    \n" + "Created from deployment config {{deploymentConfigId}}\n" + "\n" + "\n" + "
    " ); $templateCache.put('views/_edit-request-limit.html', "\n" + "

    \n" + "{{type | computeResourceLabel : true}}\n" + "\n" + "{{limits.min | usageWithUnits : type}} min to {{limits.max | usageWithUnits : type}} max\n" + "\n" + "\n" + "Min: {{limits.min | usageWithUnits : type}}\n" + "\n" + "\n" + "Max: {{limits.max | usageWithUnits : type}}\n" + "\n" + "

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    " ); $templateCache.put('views/_overview-deployment.html', "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Deployment: \n" + "\n" + "{{deploymentConfigId}},\n" + "#{{rc | annotation:'deploymentVersion'}}\n" + "\n" + "\n" + "\n" + "\n" + " In progress\n" + "\n" + " Cancelled\n" + " Failed\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "from image change\n" + "\n" + "\n" + "from config change\n" + "{{cause.type}}\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Replication Controller:\n" + "{{rc.metadata.name}}\n" + "
    \n" + "
    \n" + "
    \n" + "created \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_overview-monopod.html', "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Pod: {{pod.metadata.name}}\n" + "
    \n" + "
    \n" + "created \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_parse-error.html', "
    \n" + "\n" + "\n" + "Failed to process the resource.\n" + "
    {{error.message}}
    \n" + "
    " ); $templateCache.put('views/_pod-template.html', "
    \n" + "\n" + "This container has no health checks\n" + " 1\">Not all containers have health checks\n" + "to ensure your application is running correctly.\n" + "Add Health Checks\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Container: {{container.name}}
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Image:\n" + "{{container.image | imageStreamName}}\n" + "\n" + "{{container.image | imageStreamName}}\n" + "{{imagesByDockerReference[container.image].metadata.name | stripSHAPrefix | limitTo: 7}}\n" + "\n" + "{{imagesByDockerReference[container.image].dockerImageMetadata.Size | humanizeSize}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Source:\n" + "\n" + "\n" + "\n" + "{{build.spec.revision.git.message}}\n" + "{{build.spec.revision.git.commit | limitTo:7}}\n" + "\n" + "authored by {{build.spec.revision.git.author.name}}\n" + "\n" + "\n" + "\n" + "{{build.spec.source.git.uri}}\n" + "\n" + "\n" + "\n" + "{{build.spec.source.type || 'Unknown'}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "Command:\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    0\" class=\"pod-template-ports icon-row\">\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Ports:\n" + "\n" + "{{port.containerPort}}/{{port.protocol}}\n" + " ({{port.name}})\n" + " {{port.hostPort}}\n" + "\n" + ", \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Mount:\n" + "\n" + "{{mount.name}} → {{mount.mountPath}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "CPU:\n" + "\n" + "{{container.resources.requests.cpu | usageWithUnits: 'cpu'}} to {{container.resources.limits.cpu | usageWithUnits: 'cpu'}}\n" + "\n" + "\n" + "{{container.resources.limits.cpu | usageWithUnits: 'cpu'}} limit\n" + "\n" + "\n" + "{{container.resources.requests.cpu | usageWithUnits: 'cpu'}} requested\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Memory:\n" + "\n" + "{{container.resources.requests.memory | usageWithUnits: 'memory'}} to {{container.resources.limits.memory | usageWithUnits: 'memory'}}\n" + "\n" + "\n" + "{{container.resources.limits.memory | usageWithUnits: 'memory'}} limit\n" + "\n" + "\n" + "{{container.resources.requests.memory | usageWithUnits: 'memory'}} requested\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Readiness Probe:\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Liveness Probe:\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_pods.html', "
    3\">\n" + "
    \n" + "
    0)\" ng-click=\"expandPhase(phase, false, $event)\" title=\"Expand to see individual pods\">\n" + "
    \n" + "{{phasePods.length - troublePods.length}}\n" + "
    \n" + "
    {{phase}}
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "{{troublePods.length}}\n" + "\n" + "
    \n" + "
    {{phase}}
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    3\">\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    0\">\n" + " 3\" style=\"margin-right: 5px; color: #999\">... and {{phasePods.length - 3}} more\n" + "Collapse\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    0\">\n" + " 3\" style=\"margin-right: 5px; color: #999\">... and {{phasePods.length - 3}} more\n" + "Collapse\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_project-page.html', "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_quota-usage-chart.html', "
    \n" + "
    " ); $templateCache.put('views/_request-access.html', "

    \n" + "If you need to create resources in this project, a project administrator can grant you additional access by running this command:\n" + "

    \n" + "oc policy add-role-to-user <role> {{user.metadata.name}} -n {{projectName}}" ); $templateCache.put('views/_settings-general-info.html', "

    General information

    \n" + "
    \n" + "
    \n" + "
    \n" + "Name:\n" + "
    \n" + "
    \n" + "{{projectName}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Display Name:\n" + "
    \n" + "
    \n" + "
    \n" + "{{project | displayName: true}}\n" + "
    \n" + "
    \n" + "No display name\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Description:
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "No description\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    {{projectName}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_sidebar.html', "" ); $templateCache.put('views/_tasks.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "{{ task | taskTitle }}.\n" + "\n" + "\n" + "\n" + "\n" + "Show Details\n" + "Hide Details\n" + "\n" + "\n" + "\n" + "|\n" + "\n" + "Dismiss\n" + "\n" + "\n" + "\n" + "
    \n" + "

    Helpful Links

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_templateopt.html', "
    \n" + "
    \n" + "
    \n" + "

    Parameters

    \n" + "
    \n" + "
    \n" + " Collapse\n" + " Edit Parameters\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    {{parameter.description}}
    \n" + "
    \n" + "
    {{parameter.displayName || parameter.name}} is required.
    \n" + "
    \n" + "
    \n" + "The current value is \"{{parameter.value}}\", which is not empty.\n" + "This will prevent a value from being generated.\n" + "If this isn't what you want,\n" + "clear the value.\n" + "
    \n" + "
    \n" + "
      \n" + "
    • \n" + "\n" + "{{ parameter | parameterValue }}\n" + "
      {{parameter.description}}
      \n" + "
      \n" + "
      {{parameter.name}} is required.
      \n" + "
      \n" + "
    • \n" + "
    \n" + "
    " ); $templateCache.put('views/_triggers.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Build\n" + "\n" + "{{build | buildConfigForBuild}},\n" + "#{{build | annotation : 'buildNumber'}}\n" + "\n" + "\n" + "{{build.metadata.name}}\n" + "\n" + "
    \n" + "
    \n" + "\n" + "{{build.status.phase}}.\n" + "{{build.status.message}}.\n" + "A new deployment will be created automatically once the build completes.\n" + "
    \n" + "\n" + "
    \n" + "View Log\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_volumes.html', "
    \n" + "

    \n" + "{{volume.name}}\n" + "\n" + "Remove\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "secret\n" + "(populated by a secret when the pod is created)\n" + "
    \n" + "
    Secret:
    \n" + "
    \n" + "\n" + "{{volume.secret.secretName}}\n" + "\n" + "\n" + "{{volume.secret.secretName}}\n" + "\n" + "
    \n" + "
    \n" + "
    Key to File:
    \n" + "
    {{item.key}} → {{item.path}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "persistent volume claim\n" + "(reference to a persistent volume claim)\n" + "
    \n" + "
    Claim name:
    \n" + "
    {{volume.persistentVolumeClaim.claimName}}
    \n" + "
    Mode:
    \n" + "
    \n" + "read-only\n" + "read-write\n" + "
    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "host path\n" + "(bare host directory volume)\n" + "
    \n" + "
    Path:
    \n" + "
    {{volume.hostPath.path}}
    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "empty dir\n" + "(temporary directory destroyed with the pod)\n" + "
    \n" + "
    Medium:
    \n" + "
    \n" + "node's default\n" + "{{volume.emptyDir.medium}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "git repo\n" + "(pulled from git when the pod is created)\n" + "
    \n" + "
    Repository:
    \n" + "
    {{volume.gitRepo.repository}}
    \n" + "
    Revision:
    \n" + "
    {{volume.gitRepo.revision}}
    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "downward API\n" + "(populated with information about the pod)\n" + "
    \n" + "
    \n" + "
    Volume File:
    \n" + "
    {{item.fieldRef.fieldPath}} → {{item.path}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Type:
    \n" + "
    \n" + "config map\n" + "(populated by a config map)\n" + "
    \n" + "
    Config Map:
    \n" + "
    {{volume.configMap.name}}
    \n" + "
    \n" + "
    Key to File:
    \n" + "
    {{item.key}} → {{item.path}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/_webhook-trigger-cause.html', "{{trigger.message === 'GitHub WebHook' ? 'GitHub webhook' : 'Generic webhook'}}: {{trigger.githubWebHook.revision.git.message || trigger.genericWebHook.revision.git.message}}\n" + "{{trigger.githubWebHook.revision.git.commit || trigger.genericWebHook.revision.git.commit | limitTo:7}}\n" + "\n" + "\n" + "authored by {{trigger.githubWebHook.revision.git.author.name || trigger.genericWebHook.revision.git.author.name}},\n" + "\n" + "\n" + "no revision information,\n" + "\n" + "Show Obfuscated Secret\n" + "\n" + "{{trigger.githubWebHook.secret || trigger.genericWebHook.secret}}\n" + "" ); $templateCache.put('views/about.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "

    Red Hat OpenShift ®

    \n" + "

    About

    \n" + "

    OpenShift is Red Hat's Platform-as-a-Service (PaaS) that allows developers to quickly develop, host, and scale applications in a cloud environment.

    \n" + "

    Version

    \n" + "
    \n" + "
    OpenShift Master:
    \n" + "
    {{version.master.openshift || 'unknown'}}
    \n" + "
    Kubernetes Master:
    \n" + "
    {{version.master.kubernetes || 'unknown'}}
    \n" + "
    \n" + "

    The documentation contains information and guides to help you learn about OpenShift and start exploring its features. From getting started with creating your first application, to trying out more advanced build and deployment techniques, it provides what you need to set up and manage your OpenShift environment as an application developer.

    \n" + "

    With the OpenShift command line interface (CLI), you can create applications and manage OpenShift projects from a terminal. To get started using the CLI, visit Command Line Tools.\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/add-config-volume.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    The {{kind | humanizeKind}} could not be loaded.

    \n" + "

    {{error | getErrorDetails}}

    \n" + "
    \n" + "
    \n" + "
    \n" + "

    No config maps or secrets.

    \n" + "

    \n" + "There are no config maps or secrets in project {{project | displayName}} to use as a volume for this {{kind | humanizeKind}}.\n" + "

    \n" + "

    Back to {{kind | humanizeKind}} {{name}}

    \n" + "
    \n" + "
    \n" + "

    Add Config Files

    \n" + "
    \n" + "Add values from a config map or secret as volume. This will make the data available as files for {{kind | humanizeKind}} {{name}}.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "{{$select.selected.metadata.name}}\n" + "– {{$select.selected.kind | humanizeKind : true}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "Create Config Map\n" + "\n" + "\n" + "|\n" + "Create Secret\n" + "\n" + "
    \n" + "
    \n" + "Pick the config source. Its data will be mounted as a volume in the container.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "Mount path for the volume.\n" + "\n" + "A file will be created in this directory for each key from the config map or secret. The file contents will be the value of the key.\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Mount path must be a valid path to a directory starting with /.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "The mount path is already used. Please choose another mount path.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "Add only certain keys or use paths that are different than the key names.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Keys and Paths

    \n" + "
    \n" + "Select the keys to use and the file paths where each key will be exposed. The file paths are relative to the mount path. The contents of each file will be the value of the key.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "Path must be a relative path. It cannot start with / or contain .. path elements.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Paths must be unique.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Remove item\n" + "\n" + "|\n" + "Add item\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    1\">\n" + "

    Containers

    \n" + "
    \n" + "The volume will be mounted into all containers. You can\n" + "select specific containers\n" + "instead.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/attach-pvc.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    No persistent volume claims.

    \n" + "

    \n" + "A persistent volume claim is required to attach to this {{kind | humanizeKind}}, but none are loaded on this project.\n" + "

    \n" + "
    \n" + "Create Storage\n" + "
    \n" + "

    \n" + "To claim storage from a persistent volume, refer to the documentation on using persistent volumes.\n" + "

    \n" + "

    Back to {{kind | humanizeKind}} {{name}}

    \n" + "
    \n" + "
    \n" + "

    Add Storage

    \n" + "
    \n" + "Add an existing persistent volume claim to the template of {{kind | humanizeKind}} {{name}}.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "{{pvc.metadata.name}}{{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}}{{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}}({{pvc.spec.accessModes | accessModes | join}})\n" + "{{pvc.status.phase}}\n" + "\n" + "to volume {{pvc.spec.volumeName}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Select storage to use.\n" + "
    \n" + "
    \n" + "Select storage to use or create storage.\n" + "
    \n" + "

    Volume

    \n" + "
    \n" + "Specify details about how volumes are going to be mounted inside containers.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "Mount path for the volume inside the container. If not specified, the volume will not be mounted automatically.\n" + "
    \n" + "
    \n" + "\n" + "Mount path must be a valid path to a directory starting with /.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Volume mount in that path already exists. Please choose another mount path.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "Unique name used to identify this volume. If not specified, a volume name is generated.\n" + "
    \n" + "
    \n" + "\n" + "Volume names may only contain lower-case letters, numbers, and dashes. They may not start or end with a dash.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Volume names cannot be longer than 63 characters.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Volume name already exists. Please choose another name.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    1\">\n" + "
    \n" + "The volume will be mounted into all containers. You can\n" + "select specific containers\n" + "instead.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/_build-details.html', "
    \n" + "
    \n" + "
    \n" + "

    Status

    \n" + "
    \n" + "
    Status:
    \n" + "
    \n" + "\n" + "{{build.status.phase}}\n" + "{{build.status.message}}\n" + "\n" + "\n" + "View Log\n" + "\n" + "
    \n" + "
    Started:
    \n" + "
    \n" + "\n" + "\n" + " {{build.status.startTimestamp | date : 'medium'}}\n" + "\n" + "not started\n" + "
    \n" + "
    Duration:
    \n" + "
    \n" + "\n" + "{{(build.status.startTimestamp || build.metadata.creationTimestamp) | duration : build.status.completionTimestamp}}\n" + "{{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n" + "running for \n" + "waiting for \n" + "waiting for \n" + "\n" + "{{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n" + "waited for {{build.metadata.creationTimestamp | duration : build.status.completionTimestamp}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    Triggered By:
    \n" + "
    \n" + "
    \n" + "
    \n" + "Manual build\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "{{trigger.message}} for {{trigger.imageChangeBuild.fromRef.name}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Configuration created from {{buildConfigName}}

    \n" + "
    \n" + "
    Build Strategy:
    \n" + "
    {{build.spec.strategy.type | startCase}}
    \n" + "
    Builder Image:
    \n" + "
    {{(build | buildStrategy).from | imageObjectRef : build.metadata.namespace}}none
    \n" + "
    Source Type:
    \n" + "
    {{build.spec.source.type}}
    \n" + "
    Source Repo:
    \n" + "
    {{build.spec.source.git.uri}}
    \n" + "
    Source Ref:
    \n" + "
    {{build.spec.source.git.ref}}
    \n" + "
    Source Context Dir:
    \n" + "
    {{build.spec.source.contextDir}}
    \n" + "
    Output Image:
    \n" + "
    \n" + "\n" + "{{outputTo | imageObjectRef : build.metadata.namespace}}\n" + "\n" + "\n" + "{{outputTo | imageObjectRef : build.metadata.namespace}}\n" + "\n" + "
    \n" + "
    Push Secret:
    \n" + "
    {{build.spec.output.pushSecret.name}}
    \n" + "
    \n" + "Jenkinsfile Path:\n" + "
    \n" + "
    \n" + "\n" + "{{build.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}}\n" + "\n" + "\n" + "{{build.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}}\n" + "\n" + "
    \n" + "
    \n" + "What's a Jenkinsfile?\n" + "
    \n" + "
    \n" + "What's a Jenkinsfile?\n" + "
    \n" + "
    \n" + "Jenkinsfile:\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    " ); $templateCache.put('views/browse/_pod-details.html', "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Status\n" + "\n" + "debugging\n" + "{{pod | debugPodSourceName}}\n" + "\n" + "

    \n" + "
    \n" + "
    Status:
    \n" + "
    \n" + "\n" + "{{pod | podStatus | sentenceCase}}, ran for {{(pod | podStartTime) | duration : (pod | podCompletionTime)}}\n" + "(expires {{pod.metadata.deletionTimestamp | date : 'medium'}})\n" + "
    \n" + "
    Message:
    \n" + "
    {{pod.status.message}}
    \n" + "
    \n" + "Deployment:\n" + "
    \n" + "
    \n" + "{{dcName}},\n" + "#{{deploymentVersion}}{{rcName}}\n" + "
    \n" + "
    Grace Period:
    \n" + "
    \n" + "\n" + "\n" + "{{pod.spec.terminationGracePeriodSeconds}} seconds\n" + "\n" + "= 60\">\n" + "{{pod.spec.terminationGracePeriodSeconds | humanizeDurationValue : 'seconds'}}\n" + "\n" + "
    \n" + "
    IP:
    \n" + "
    {{pod.status.podIP || 'unknown'}}
    \n" + "
    Node:
    \n" + "
    {{pod.spec.nodeName || 'unknown'}} ({{pod.status.hostIP}})
    \n" + "
    Restart Policy:
    \n" + "
    {{pod.spec.restartPolicy || 'Always'}}
    \n" + "
    Active Deadline:
    \n" + "
    \n" + "\n" + "\n" + "{{pod.spec.activeDeadlineSeconds}} seconds\n" + "\n" + "= 60\">\n" + "{{pod.spec.activeDeadlineSeconds | humanizeDurationValue : 'seconds'}}\n" + "\n" + "\n" + "( elapsed)\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    Container {{containerStatus.name}}

    \n" + "
    \n" + "
    State:
    \n" + "
    \n" + "\n" + "
    \n" + "
    Last State
    \n" + "
    \n" + "\n" + "
    \n" + "
    Ready:
    \n" + "
    {{containerStatus.ready}}
    \n" + "
    Restart Count:
    \n" + "
    {{containerStatus.restartCount}}
    \n" + "
    \n" + "Debug in Terminal\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Template

    \n" + "\n" + "\n" + "

    Volumes

    \n" + "\n" + "
    none
    \n" + "

    \n" + "Add Storage to {{dcName}}\n" + "|\n" + "Add Config Files to {{dcName}}\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "
    " ); $templateCache.put('views/browse/_replica-set-actions.html', "
    \n" + "\n" + "Actions\n" + "\n" + "
    " ); $templateCache.put('views/browse/_replica-set-details.html', "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Status:
    \n" + "
    \n" + "\n" + "{{replicaSet | deploymentStatus}}\n" + "\n" + "\n" + "
    \n" + "Use the following settings from {{replicaSet.metadata.name}} when rolling back:\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    Deployment Config:
    \n" + "
    \n" + "{{deploymentConfigName}}\n" + "
    \n" + "
    Status Reason:
    \n" + "
    \n" + "{{replicaSet | annotation:'deploymentStatusReason'}}\n" + "
    \n" + "
    Duration:
    \n" + "
    \n" + "\n" + "running for \n" + "waiting for \n" + "\n" + "
    \n" + "
    Selectors:
    \n" + "
    \n" + "\n" + "
    \n" + "
    Replicas:
    \n" + "
    \n" + "\n" + "\n" + "\n" + "(autoscaled)\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Template

    \n" + "\n" + "\n" + "

    Volumes

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "Add Storage\n" + "|\n" + "Add Config Files\n" + "
    \n" + "
    none
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Add Storage\n" + "|\n" + "Add Config Files\n" + "
    \n" + "
    \n" + "\n" + "none\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    none
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Add Storage\n" + "|\n" + "Add Config Files\n" + "
    \n" + "
    \n" + "\n" + "none\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Autoscaling

    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "{{warning.message}}\n" + "\n" + "\n" + "\n" + "Edit Resource\n" + "Requests and Limits\n" + "\n" + "Edit Resource\n" + "Requests and Limits\n" + "Edit Resource\n" + "Requests and Limits\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "Add Autoscaler\n" + "Add Autoscaler\n" + "Add Autoscaler\n" + "Add Autoscaler\n" + "\n" + "\n" + "Autoscaling is not enabled. There are no autoscalers for this\n" + "deployment config or deployment.\n" + "{{replicaSet.kind | humanizeKind}}.\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Pods

    \n" + "\n" + "" ); $templateCache.put('views/browse/_replication-controller-actions.html', "
    \n" + "\n" + "Actions\n" + "\n" + "
    " ); $templateCache.put('views/browse/build-config.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "

    \n" + "{{buildConfigName}}\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "Actions\n" + "\n" + "
    \n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "History\n" + "\n" + "
    Loading...
    \n" + "\n" + "
    \n" + "

    No builds.

    \n" + "

    \n" + "\n" + "\n" + "Builds will create an image from\n" + "\n" + "\n" + "Start a new build to create an image from\n" + "\n" + "\n" + "source repository\n" + "{{buildConfig.spec.source.git.uri}}\n" + "\n" + "\n" + "build configuration {{buildConfig.metadata.name}}.\n" + "\n" + "\n" + "\n" + "No pipeline builds have run for {{buildConfigName}}.\n" + "
    \n" + "\n" + "View the Jenkinsfile to see what stages will run.\n" + "\n" + "\n" + "View the file {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} in the\n" + "source repository\n" + "source repository\n" + "to see what stages will run.\n" + "\n" + "
    \n" + "

    \n" + "\n" + "
    \n" + "\n" + "
    0\" class=\"build-config-summary\">\n" + "\n" + "
    \n" + "\n" + "\n" + "Build\n" + "\n" + "#{{latestBuild | annotation : 'buildNumber'}}{{latestBuild.metadata.name}}\n" + "\n" + "failed.\n" + "encountered an error.\n" + "was cancelled.\n" + "is {{latestBuild.status.phase | lowercase}}.\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "View Log\n" + "\n" + "\n" + "\n" + "View Log\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "created \n" + "\n" + "\n" + "started \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    0\">\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    BuildStatusDurationCreated
    {{emptyMessage}}
    \n" + "\n" + "\n" + "#{{build | annotation : 'buildNumber'}}\n" + "\n" + "\n" + "{{build.metadata.name}}\n" + "\n" + "\n" + "
    \n" + "\n" + "{{build.status.phase}}\n" + "{{build.status.reason | sentenceCase}}\n" + "
    \n" + "
    \n" + "\n" + "{{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    {{emptyMessage}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Configuration\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "

    Details

    \n" + "
    \n" + "
    \n" + "
    Build Strategy:
    \n" + "
    {{buildConfig.spec.strategy.type | startCase}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Source Repo:
    \n" + "
    {{buildConfig.spec.source.git.uri}}
    \n" + "
    Source Ref:
    \n" + "
    {{buildConfig.spec.source.git.ref}}
    \n" + "
    Source Context Dir:
    \n" + "
    {{buildConfig.spec.source.contextDir}}
    \n" + "
    \n" + "
    \n" + "
    Jenkinsfile Path:
    \n" + "
    \n" + "{{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}}\n" + "
    \n" + "
    \n" + "{{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}}\n" + "
    \n" + "
    \n" + "What's a Jenkinsfile?\n" + "
    \n" + "
    \n" + "
    Binary Input as File:
    \n" + "
    {{buildConfig.spec.source.binary.asFile}}
    \n" + "
    \n" + "
    Source:
    \n" + "
    \n" + "none\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Image Sources:
    \n" + "
    \n" + "
    \n" + "

    {{imageSource.from | imageObjectRef : buildConfig.metadata.namespace}}

    \n" + "
    \n" + "
    \n" + "
    Paths:
    \n" + "
    \n" + "
    {{source}}{{destination}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Builder Image:
    \n" + "
    \n" + "\n" + "{{buildFrom | imageObjectRef : buildConfig.metadata.namespace}}\n" + "\n" + "\n" + "{{buildFrom | imageObjectRef : buildConfig.metadata.namespace}}\n" + "\n" + "
    \n" + "
    \n" + "
    Output To:
    \n" + "
    \n" + "\n" + "{{outputTo | imageObjectRef : buildConfig.metadata.namespace}}\n" + "\n" + "\n" + "{{outputTo | imageObjectRef : buildConfig.metadata.namespace}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Run Policy:
    \n" + "
    \n" + "{{buildConfig.spec.runPolicy | sentenceCase}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    Dockerfile:
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "What's a Jenkinsfile?\n" + "
    \n" + "
    \n" + "Jenkinsfile:\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Triggers

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    GitHub Webhook URL:\n" + "Learn More \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Generic Webhook URL:\n" + "Learn More \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "New Image For:\n" + "
    \n" + "
    \n" + "\n" + "{{triggerFrom | imageObjectRef : buildConfig.metadata.namespace}}\n" + "\n" + "\n" + "{{triggerFrom | imageObjectRef : buildConfig.metadata.namespace}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Config Change For:
    \n" + "
    Build config {{buildConfig.metadata.name}}
    \n" + "
    \n" + "
    \n" + "
    Other Trigger:
    \n" + "
    {{trigger.type}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Manual (CLI):\n" + "\n" + "Learn More  \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "Environment\n" + "

    Environment Variables

    \n" + "

    \n" + "The builder image has additional environment variables defined. Variables defined below will overwrite any from the image with the same name.\n" + "Show Image Environment Variables\n" + "Hide Image Environment Variables\n" + "

    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "Clear Changes\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/build.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{build.metadata.name}}\n" + "\n" + "\n" + "created \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Actions\n" + "\n" + "
    \n" + "

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Details\n" + "\n" + "\n" + "\n" + "\n" + "Environment\n" + "

    Environment Variables

    \n" + "

    \n" + "\n" + "Environment variables can be edited on the build configuration.\n" + "

    \n" + "\n" + "The build strategy had no environment variables defined.\n" + "
    \n" + "\n" + "Logs\n" + "\n" + "\n" + "\n" + "{{build.status.phase}}\n" + "
    \n" + "Log from {{build.status.startTimestamp | date : 'medium'}}\n" + "\n" + "to {{build.status.completionTimestamp | date : 'medium'}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Events\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/config-map.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    The config map could not be loaded.

    \n" + "

    {{error | getErrorDetails}}

    \n" + "
    \n" + "
    \n" + "

    \n" + "
    \n" + "\n" + "Actions\n" + "
      \n" + "
    • \n" + "Edit\n" + "
    • \n" + "
    • \n" + "Edit YAML\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "{{configMap.metadata.name}}\n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    The config map has no items.

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{prop}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/config-maps.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Create Config Map\n" + "
    \n" + "

    \n" + "Config Maps\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameCreatedLabels
    No config maps to show
    \n" + "{{configMap.metadata.name}}\n" + "\n" + "\n" + "\n" + "none\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/deployment-config.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    \n" + "{{deploymentConfigName}}\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "Actions\n" + "\n" + "
    \n" + "\n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{deploymentConfig.metadata.name}} is paused.\n" + "This will stop any new deployments and deployment triggers from running until resumed.\n" + "\n" + "Resume deployment\n" + "\n" + "
    \n" + "\n" + "\n" + "History\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "Deployment\n" + "\n" + "#{{mostRecent | annotation : 'deploymentVersion'}}{{mostRecent.metadata.name}}\n" + "is\n" + "{{mostRecent | deploymentStatus | lowercase}}.\n" + "View Log\n" + "\n" + "\n" + "
    \n" + "
    \n" + "created \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    DeploymentStatusCreatedTrigger
    {{emptyMessage}}
    \n" + "\n" + "\n" + "#{{deployment | annotation : 'deploymentVersion'}}\n" + "(latest)\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "{{deployment | deploymentStatus}},\n" + "{{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "Unknown\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Image change\n" + "\n" + "\n" + "Config change\n" + "{{cause.type}}\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Configuration\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "

    Details

    \n" + "
    \n" + "
    Selectors:
    \n" + "
    \n" + "\n" + "
    \n" + "
    Replicas:
    \n" + "
    \n" + "\n" + "(autoscaled)\n" + "
    \n" + "
    Strategy:
    \n" + "
    {{deploymentConfig.spec.strategy.type}}
    \n" + "
    \n" + "
    Timeout:
    \n" + "
    {{strategyParams.timeoutSeconds}} sec
    \n" + "
    Update Period:
    \n" + "
    {{strategyParams.updatePeriodSeconds}} sec
    \n" + "
    Interval:
    \n" + "
    {{strategyParams.intervalSeconds}} sec
    \n" + "
    Max Unavailable:
    \n" + "
    {{strategyParams.maxUnavailable}}
    \n" + "
    Max Surge:
    \n" + "
    {{strategyParams.maxSurge}}
    \n" + "
    \n" + "\n" + "
    \n" + "

    Template

    \n" + "\n" + "\n" + "

    Volumes

    \n" + "

    \n" + "none\n" + "

    \n" + "\n" + "\n" + "

    \n" + "Add Storage\n" + "|\n" + "Add Config Files\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "

    Autoscaling

    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "{{warning.message}}\n" + "\n" + "Edit Resource\n" + "Requests and Limits\n" + "
    \n" + "\n" + "
    \n" + "Add Autoscaler\n" + "Autoscaling is not enabled. There are no autoscalers for this deployment config.\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Hooks\n" + "\n" + "Learn More \n" + "\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "none\n" + "
    \n" + "
    \n" + "
    \n" + "

    Triggers

    \n" + "
    \n" + "
    Manual (CLI):\n" + "\n" + "Learn More \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "{{trigger.type}}\n" + "\n" + "
    New Image For:
    \n" + "
    \n" + "{{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}}\n" + "(disabled)\n" + "
    \n" + "
    \n" + "\n" + "
    Change Of:
    \n" + "
    Config
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "Environment\n" + "\n" + "
    \n" + "

    Container {{container.name}} Environment Variables

    \n" + "\n" + "\n" + "
    \n" + "\n" + "Clear Changes\n" + "
    \n" + "
    \n" + "\n" + "Events\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/deployment.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    \n" + "{{name}}\n" + "
    \n" + "\n" + "Actions\n" + "\n" + "
    \n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{deployment.metadata.name}} is paused.\n" + "This will pause any in-progress rollouts and stop new rollouts from running until the deployment is resumed.\n" + "\n" + "Resume deployment\n" + "\n" + "
    \n" + "\n" + "\n" + "History\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    VersionNameReplicasCreated
    \n" + "#{{replicaSet | annotation : 'deployment.kubernetes.io/revision'}}\n" + "\n" + "{{replicaSet.metadata.name}}\n" + "\n" + "{{replicaSet.status.replicas}}/{{replicaSet.spec.replicas}} replicas\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Configuration\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "

    Details

    \n" + "
    \n" + "
    Selectors:
    \n" + "
    \n" + "\n" + "
    \n" + "
    Replicas:
    \n" + "
    \n" + "\n" + "(autoscaled)\n" + "
    \n" + "{{deployment.status.updatedReplicas}} up to date\n" + "
    \n" + "
    \n" + "{{deployment.status.availableReplicas}} available,\n" + "{{deployment.status.unavailableReplicas}} unavailable\n" + "
    \n" + "
    \n" + "
    Strategy:
    \n" + "
    {{deployment.spec.strategy.type | sentenceCase}}
    \n" + "
    \n" + "Max Unavailable:\n" + "\n" + "
    \n" + "
    \n" + "1\n" + "\n" + "{{deployment.spec.strategy.rollingUpdate.maxUnavailable}}\n" + "\n" + "
    \n" + "
    \n" + "Max Surge:\n" + "\n" + "
    \n" + "
    \n" + "1\n" + "\n" + "{{deployment.spec.strategy.rollingUpdate.maxSurge}}\n" + "\n" + "
    \n" + "
    \n" + "Min Ready:\n" + "\n" + "
    \n" + "
    \n" + "{{deployment.spec.minReadySeconds || 0}} sec\n" + "
    \n" + "
    \n" + "

    Template

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Volumes

    \n" + "

    \n" + "none\n" + "

    \n" + "\n" + "\n" + "
    \n" + "Add Storage\n" + "|\n" + "Add Config Files\n" + "
    \n" + "

    Autoscaling

    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "{{warning.message}}\n" + "\n" + "Edit Resource\n" + "Requests and Limits\n" + "
    \n" + "\n" + "
    \n" + "Add Autoscaler\n" + "none\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Environment\n" + "\n" + "
    \n" + "

    Container {{container.name}} Environment Variables

    \n" + "\n" + "\n" + "
    \n" + "\n" + "Clear Changes\n" + "
    \n" + "
    \n" + "\n" + "Events\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/image.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{imageStream.metadata.name}}:{{tagName}}\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "Details\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Configuration\n" + "\n" + "\n" + "\n" + "\n" + "Layers\n" + "
    No layer information is available for this image.
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/imagestream.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{imageStream.metadata.name}}\n" + "
    \n" + "\n" + "Actions\n" + "
      \n" + "
    • \n" + "Edit YAML\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Follows docker repo:
    \n" + "
    {{imageStream.spec.dockerImageRepository}}
    \n" + "
    Docker pull spec:
    \n" + "
    {{imageStream.status.dockerImageRepository}}
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    TagFromLatest ImageCreatedPull Spec
    {{emptyMessage}}
    {{tag.name}}\n" + "\n" + "pushed\n" + "
    \n" + "\n" + "{{tag.spec.from.name}}\n" + "\n" + "\n" + "{{tag.spec.from._completeName}}\n" + "\n" + "{{tag.spec.from.namespace}}/{{tag.spec.from._imageStreamName}}{{tag.spec.from._nameConnector}}{{tag.spec.from._idOrTag}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Unable to resolve\n" + "
    \n" + "
    \n" + "Not yet synced\n" + "\n" + "Unresolved\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "{{tag.status.items[0].dockerImageReference}}\n" + "
    \n" + "
    \n" + "
     {{tag.name}} \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "{{item.dockerImageReference}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/persistent-volume-claim.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{pvc.metadata.name}}\n" + "\n" + "\n" + "waiting for {{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}} allocation,\n" + "\n" + "waiting for allocation,\n" + "\n" + "created \n" + "
    \n" + "\n" + "Actions\n" + "
      \n" + "
    • \n" + "Edit YAML\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Status:
    \n" + "
    \n" + "\n" + "{{pvc.status.phase}}\n" + "to volume {{pvc.spec.volumeName}}\n" + "
    \n" + "
    Capacity:
    \n" + "
    \n" + "\n" + "allocated {{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}}\n" + "\n" + "allocated unknown size\n" + "
    \n" + "
    Requested Capacity:
    \n" + "
    \n" + "\n" + "{{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}}\n" + "\n" + "none\n" + "
    \n" + "
    Access Modes:
    \n" + "
    {{pvc.spec.accessModes | accessModes:'long' | join}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/pod.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{pod.metadata.name}}\n" + "
    \n" + "\n" + "Actions\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Details\n" + "\n" + "\n" + "\n" + "Environment\n" + "
    \n" + "

    Container {{container.name}} Environment Variables

    \n" + "\n" + "The container specification has no environment variables set.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Logs\n" + "\n" + "\n" + "\n" + "\n" + "{{pod.spec.containers[0].name}}\n" + "\n" + " 1\" ng-model=\"logOptions.container\" input-id=\"selectLogContainer\">\n" + "{{$select.selected.name}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "{{containerStateReason || containerStatusKey | sentenceCase}}\n" + "\n" + "\n" + "Log from {{containerStartTime | date : 'medium'}} to {{containerEndTime | date : 'medium'}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Terminal\n" + "
    \n" + "

    \n" + "No running containers\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "When you navigate away from this pod, any open terminal connections will be closed. This will kill any foreground processes you started from the terminal.\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{pod.spec.containers[0].name}}\n" + "\n" + " 1\" class=\"mar-left-none pad-left-none pad-right-none\">\n" + "\n" + "\n" + "{{selectedTerminalContainer.containerName}}\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "{{term.status}}\n" + "\n" + "\n" + "{{term.containerState}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Events\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/replica-set.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{replicaSet.metadata.name}}\n" + "\n" + "\n" + "Warning: The deployment's deployment config is missing.\n" + "created \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Details\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "Environment\n" + "\n" + "
    \n" + "

    \n" + "\n" + "Environment variables can be edited on the deployment.\n" + "

    \n" + "

    \n" + "\n" + "Environment variables can be edited on the deployment configuration.\n" + "

    \n" + "
    \n" + "

    Container {{container.name}} Environment Variables

    \n" + "\n" + "The container specification has no environment variables set.\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "Clear changes\n" + "
    \n" + "
    \n" + "\n" + "The container specification has no environment variables set.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Logs\n" + "\n" + "\n" + "\n" + "\n" + "{{replicaSet | deploymentStatus}}\n" + "\n" + "\n" + "\n" + "\n" + "Events\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/route.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{route.metadata.name}}\n" + "\n" + "\n" + "created \n" + "
    \n" + "\n" + "Actions\n" + "
      \n" + "
    • \n" + "Edit\n" + "
    • \n" + "
    • \n" + "Edit YAML\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Hostname 1\">s:
    \n" + "
    \n" + "\n" + "{{route | routeLabel : null : true}}\n" + "\n" + "\n" + "Pending\n" + "\n" + "\n" + "
    \n" + "\n" + "{{route | routeLabel : ingress.host : true}}\n" + "\n" + "\n" + "{{route | routeLabel : ingress.host}}\n" + "\n" + "–\n" + "\n" + "admission status unknown for router '{{ingress.routerName}}'\n" + "\n" + "exposed on router '{{ingress.routerName}}' \n" + "\n" + "\n" + "rejected by router '{{ingress.routerName}}' \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    Wildcard Policy:
    \n" + "
    {{route.spec.wildcardPolicy}}
    \n" + "
    Path:
    \n" + "
    \n" + "{{route.spec.path}}\n" + "none\n" + "
    \n" + "
    {{route.spec.to.kind || \"Routes To\"}}:
    \n" + "
    \n" + "{{route.spec.to.name}}\n" + "
    \n" + "
    Target Port:
    \n" + "
    \n" + "\n" + "{{route.spec.port.targetPort}}\n" + "\n" + "any\n" + "
    \n" + "
    \n" + "This target port will route to {{route | routeTargetPortMapping : services[route.spec.to.name]}}.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Traffic

    \n" + "
    \n" + "This route splits traffic across multiple services.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    ServiceWeight
    \n" + "{{route.spec.to.name}}\n" + "\n" + "{{route.spec.to.weight}}\n" + "
    \n" + "{{alternate.name}}\n" + "\n" + "{{alternate.weight}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    TLS Settings

    \n" + "
    \n" + "
    Termination Type:
    \n" + "
    {{route.spec.tls.termination | humanizeTLSTermination}}
    \n" + "
    Insecure Traffic:
    \n" + "
    {{route.spec.tls.insecureEdgeTerminationPolicy || 'None'}}
    \n" + "
    Certificate:
    \n" + "
    \n" + "\n" + "Show\n" + "\n" + "none\n" + "
    \n" + "
    \n" + "
    {{route.spec.tls.certificate}}
    \n" + "
    \n" + "
    Key:
    \n" + "
    \n" + "\n" + "Show\n" + "\n" + "none\n" + "
    \n" + "
    \n" + "
    {{route.spec.tls.key}}
    \n" + "
    \n" + "
    CA Certificate:
    \n" + "
    \n" + "\n" + "Show\n" + "\n" + "none\n" + "
    \n" + "
    \n" + "
    {{route.spec.tls.caCertificate}}
    \n" + "
    \n" + "
    Destination CA Cert:
    \n" + "
    \n" + "\n" + "Show\n" + "\n" + "none\n" + "
    \n" + "
    \n" + "
    {{route.spec.tls.destinationCACertificate}}
    \n" + "
    \n" + "
    \n" + "
    TLS is not enabled for this route
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/routes.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Create Route\n" + "
    \n" + "

    \n" + "Routes\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{customNameHeader || 'Name'}}HostnameRoutes ToTarget PortTLS Termination
    {{emptyMessage || 'No routes to show'}}
    \n" + "{{route.metadata.name}}\n" + "\n" + "\n" + "\n" + "\n" + "{{route | routeLabel}}\n" + "\n" + "\n" + "{{route | routeLabel}}\n" + "\n" + "\n" + "\n" + "Pending\n" + "\n" + "\n" + "{{route.spec.to.kind}}: {{route.spec.to.name}}\n" + "{{route.spec.to.name}}\n" + "\n" + "\n" + "{{route.spec.port.targetPort}}\n" + "\n" + "\n" + "{{route.spec.port.targetPort}}\n" + "\n" + "\n" + " \n" + "\n" + "{{route.spec.tls.termination | humanizeTLSTermination}}\n" + " \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/secret.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "
    \n" + "\n" + "Actions\n" + "
      \n" + "
    • \n" + "Edit YAML\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "{{secret.metadata.name}}\n" + "created \n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "{{secret.type}}\n" + "{{view.showSecret ? \"Hide\" : \"Reveal\"}} Secret\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    {{secretDataName}}
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "This secret value contains non-printable characters and is displayed as a Base64-encoded string.\n" + "
    \n" + "
    \n" + "
    *****
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/browse/service.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "{{service.metadata.name}}\n" + "
    \n" + "\n" + "Actions\n" + "\n" + "
    \n" + "created \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Details\n" + "
    \n" + "
    \n" + "
    Selectors:
    \n" + "
    \n" + "none\n" + " {{selectorLabel}}={{selectorValue}}, \n" + "
    \n" + "
    Type:
    \n" + "
    {{service.spec.type}}
    \n" + "
    IP:
    \n" + "
    {{service.spec.clusterIP}}
    \n" + "
    Hostname:
    \n" + "
    \n" + "{{service.metadata.name}}.{{service.metadata.namespace}}.svc\n" + "\n" + "\n" + "\n" + "
    \n" + "
    External Hostname:
    \n" + "
    {{service.spec.externalName}}
    \n" + "
    Session affinity:
    \n" + "
    {{service.spec.sessionAffinity}}
    \n" + "
    Ingress Points:
    \n" + "
    \n" + "{{ingress.ip}}, \n" + "
    \n" + "
    External IPs:
    \n" + "
    \n" + "{{externalIP}}, \n" + "
    \n" + "
    Routes:
    \n" + "
    \n" + "\n" + "Create route\n" + "None\n" + "\n" + "
    \n" + "
    \n" + "

    Traffic

    \n" + "
    \n" + "\n" + "
    \n" + "

    \n" + "Learn more about routes and services.\n" + "

    \n" + "

    Pods

    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "Events\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/builds.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Builds\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameLast BuildStatusDurationCreatedTypeSource
    {{emptyMessage}}
    \n" + "{{buildConfigName}}\n" + "No builds   {{buildConfigs[buildConfigName].spec.strategy.type | startCase}}\n" + "none\n" + "{{buildConfigs[buildConfigName].spec.source.git.uri}}\n" + "{{buildConfigName}}\n" + "\n" + "none\n" + "\n" + "\n" + "\n" + "#{{latestBuild | annotation : 'buildNumber'}}\n" + "\n" + "\n" + "{{latestBuild.metadata.name}}\n" + "\n" + "\n" + "{{latestBuild.metadata.name}}\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "{{latestBuild.status.phase}}\n" + "{{latestBuild.status.reason | sentenceCase}}\n" + "
    \n" + "
    \n" + "\n" + "{{latestBuild.status.startTimestamp | duration : latestBuild.status.completionTimestamp}}\n" + "\n" + "\n" + "{{latestBuild.spec.strategy.type | startCase}}\n" + "\n" + "\n" + "none\n" + "\n" + "{{latestBuild.spec.source.git.uri}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/catalog/_image.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "

    \n" + "\n" + "

    \n" + "
    \n" + "

    Builds source code

    \n" + "

    \n" + "\n" + "\n" + "

    \n" + "

    \n" + "Provider: {{imageStream | imageStreamTagAnnotation : 'provider' : is.tag.tag}}\n" + "

    \n" + "\n" + "

    \n" + "Namespace: {{imageStream.metadata.namespace}}\n" + "

    \n" + "
    \n" + "

    \n" + "Version\n" + "\n" + "\n" + "\n" + "{{$select.selected.tag}}\n" + "\n" + "{{otherTag}},\n" + "\n" + "\n" + "\n" + "\n" + "{{tag.tag}}\n" + "\n" + "{{otherTag}},\n" + "\n" + "\n" + "\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/catalog/_template.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "

    \n" + "\n" + "

    \n" + "
    \n" + "

    \n" + "\n" + "\n" + "

    \n" + "

    \n" + "Provider: {{template | annotation : 'provider'}}\n" + "

    \n" + "\n" + "

    \n" + "Namespace: {{template.metadata.namespace}}\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/catalog/catalog.html', "

    Loading...

    \n" + "
    \n" + "

    No images or templates.

    \n" + "

    \n" + "No images or templates are loaded for this project or the shared\n" + "openshift namespace. An image or template is required to add content.\n" + "

    \n" + "

    \n" + "To add an image stream or template from a file, use the editor in the\n" + "Import YAML / JSON tab, or run the following command:\n" + "

    oc create -f <filename> -n {{projectName}}
    \n" + "

    \n" + "

    Back to overview

    \n" + "
    \n" + "
    \n" + "

    Choose from web frameworks, databases, and other components to add content to your project.

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "All content is hidden by the current filter.\n" + "Clear Filter\n" + "
    \n" + "
    \n" + "
    \n" + "

    {{category.label}}

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    \n" + "\n" + "\n" + "{{item.label}}\n" + "\n" + "\n" + "\n" + "{{item.label}}\n" + "\n" + "

    \n" + "\n" + "
    \n" + "

    {{item.description}}

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "{{countByCategory[item.id] || 0}}\n" + "

    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    " ); $templateCache.put('views/catalog/category-content.html', "

    Loading...

    \n" + "
    \n" + "

    No images or templates.

    \n" + "

    \n" + "No images or templates are loaded for the category {{category.label}}.\n" + "

    \n" + "

    \n" + "To add an image stream or template from a file, use the editor in the\n" + "Import YAML / JSON tab, or run the following command:\n" + "

    oc create -f <filename> -n {{projectName}}
    \n" + "

    \n" + "

    Back to catalog

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "All content is hidden by the current filter.\n" + "Clear Filter\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/command-line.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Command Line Tools

    \n" + "

    \n" + "With the OpenShift command line interface (CLI), you can create applications and manage OpenShift projects from a terminal.\n" + "\n" + "You can download the oc client tool using the links below. For more information about downloading and installing it, please refer to the Get Started with the CLI documentation.\n" + "\n" + "\n" + "Refer to the Get Started with the CLI documentation for instructions about downloading and installing the oc client tool.\n" + "\n" + "

    \n" + "\n" + "
    \n" + "\n" + "\n" + "{{key}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    \n" + "

    \n" + "After downloading and installing it, you can start by logging in using this current session token:\n" + "'\">\n" + "

    \n" +
        "                      oc login {{loginBaseURL}}\n" +
        "                    
    \n" + "

    \n" + "
    \n" + "\n" + "A token is a form of a password.\n" + "Do not share your API token.\n" + "
    \n" + "

    After you login to your account you will get a list of projects that you can switch between:\n" + "'\">\n" + "

    \n" + "

    If you do not have any existing projects, you can create one:\n" + "'\">\n" + "

    \n" + "

    To show a high level overview of the current project:\n" + "\n" + "

    \n" + "

    For other information about the command line tools, check the CLI Reference and Basic CLI Operations.

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create-config-map.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Create Config Map

    \n" + "
    \n" + "Config maps hold key-value pairs that can be used in pods to read application configuration.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create-from-url.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "\n" + "\n" + "

    Source code from {{createDetails.sourceURI}} will be built and deployed unless otherwise specified in the next step.

    \n" + "
    \n" + "
    \n" + "

    Create a New Project

    \n" + "\n" + "
    \n" + "
    \n" + "

    Choose a Project

    \n" + "\n" + "\n" + "{{$select.selected | uniqueDisplayName : projects}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Choose Existing Project\n" + "\n" + "\n" + "{{$select.selected | uniqueDisplayName : projects}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "\n" + "Create a New Project\n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    \n" + "A project is required in order to complete the installation.\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create-persistent-volume-claim.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Create Storage

    \n" + "
    \n" + "Create a request for an administrator-defined storage asset by specifying size and permissions for a best fit.\n" + "Learn More \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create-project.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    New Project

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create-route.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Create Route

    \n" + "
    \n" + "Routing is a way to make your application publicly visible.\n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "Copy Service Labels\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create-secret.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Create Secret

    \n" + "
    \n" + "Secrets allow you to authenticate to a private Git repository or a private image registry.\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "Browse Catalog\n" + "\n" + "\n" + "\n" + "\n" + "Deploy Image\n" + "\n" + "\n" + "\n" + "Import YAML / JSON\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create/category.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "

    {{category.label}}

    \n" + "
    {{category.description}}
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create/fromimage.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "{{ emptyMessage }}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    Identifies the resources created for this application.
    \n" + "
    \n" + "A name is required.\n" + "
    \n" + "
    \n" + "Please enter a valid name.\n" + "

    A valid name is applied to all generated resources. It is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character.

    \n" + "
    \n" + "
    \n" + "
    \n" + "The name must have at least 2 characters.\n" + "
    \n" + "
    \n" + "This name is already in use within the project. Please choose a different name.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "Sample repository for {{imageName}}: {{image.metadata.annotations.sampleRepo}}, ref: {{image.metadata.annotations.sampleRef}}, context dir: {{image.metadata.annotations.sampleContextDir}}\n" + "Try It\n" + "
    \n" + "
    \n" + "A Git repository URL is required.\n" + "
    \n" + "
    \n" + "This might not be a valid Git URL. Check that it is the correct URL to a remote Git repository.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    Optional branch, tag, or commit.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    Optional subdirectory for the application source code, used as the context directory for the build.
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Environment Variables (Build and Runtime) \n" + "\n" + "\n" + "\n" + "

    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Autodeploy when

    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "

    Environment Variables (Runtime only) \n" + "\n" + "\n" + "\n" + "

    \n" + "

    \n" + "\n" + "{{showDCEnvs ? 'Hide' : 'Show'}} Image Environment Variables\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "

    These variables exist on the image and will be available at runtime. You may override them below.

    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{option.label}}\n" + "\n" + "\n" + "
    \n" + "Scale replicas manually or automatically based on CPU usage.\n" + "
    \n" + "
    \n" + "Learn More \n" + "
    \n" + "
    \n" + "\n" + "CPU metrics might not be available. In order to use horizontal pod autoscalers, your cluster administrator must have properly configured cluster metrics.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "The number of instances of your image.\n" + "
    \n" + "
    \n" + "Replicas must be an integer value greater than or equal to 0.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "You should configure resource limits below for autoscaling. Autoscaling will not work without a CPU\n" + "limit.\n" + "request.\n" + "\n" + "The CPU limit will be automatically calculated from the container memory limit.\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "{{problem}}\n" + "
    \n" + "
    \n" + "{{problem}}\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "Show\n" + "Hide\n" + "advanced options\n" + "for source, routes, builds, and deployments.\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/create/next-steps.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Completed. Go to overview.

    \n" + "

    Application created. Continue to overview.

    \n" + "

    Creating...

    \n" + "

    Completed, with errors

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "{{ task | taskTitle }}.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{alert.message}}{{alert.details}}.\n" + "
    \n" + "
    \n" + "\n" + "{{alert.message}}{{alert.details}}.\n" + "
    \n" + "
    \n" + "\n" + "{{alert.message}}{{alert.details}}.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Things you can do

    \n" + "

    Go to the overview page to see more details about this project. Make sure you don't already have services, build configs, deployment configs, or other resources with the same names you are trying to create. Refer to the documentation for creating new applications for more information.

    \n" + "

    Command line tools

    \n" + "

    You may want to use the oc command line tool to help with troubleshooting. After downloading and installing it, you can log in, switch to this particular project, and try some commands :

    \n" + "
    oc login {{loginBaseUrl}}\n" +
        "oc project {{projectName}}\n" +
        "oc logs -h
    \n" + "

    For more information about the command line tools, check the CLI Reference and Basic CLI Operations.

    \n" + "
    \n" + "
    \n" + "

    Manage your app

    \n" + "

    The web console is convenient, but if you need deeper control you may want to try our command line tools.

    \n" + "

    Command line tools

    \n" + "

    Download and install the oc command line tool. After that, you can start by logging in, switching to this particular project, and displaying an overview of it, by doing:

    \n" + "
    oc login {{loginBaseUrl}}\n" +
        "oc project {{projectName}}\n" +
        "oc status
    \n" + "

    For more information about the command line tools, check the CLI Reference and Basic CLI Operations.

    \n" + "
    \n" + "
    \n" + "

    Making code changes

    \n" + "

    \n" + "You are set up to use the example git repository. If you would like to modify the source code, fork the {{createdBuildConfig.spec.source.git.uri}} repository to an OpenShift-visible git account and edit the {{createdBuildConfig.metadata.name}} build config to point to your fork.\n" + "Note that this will start a new build.\n" + "

    \n" + "
    \n" + "

    \n" + "A GitHub webhook trigger has been created for the {{createdBuildConfig.metadata.name}} build config.\n" + "

    \n" + "

    \n" + "You can configure the webhook in the forked repository's settings, using the following payload URL:\n" + "

    \n" + "

    \n" + "\n" + "You can now set up the webhook in the GitHub repository settings if you own it, in {{createdBuildConfig.spec.source.git.uri | githubLink}}/settings/hooks, using the following payload URL:\n" + "\n" + "\n" + "Your source does not appear to be a URL to a GitHub repository. If you have a GitHub repository that you want to trigger this build from then use the following payload URL:\n" + "\n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Applied Parameter Values

    \n" + "

    These parameters often include things like passwords. If you will need to reference these values later, copy them to a safe location.\n" + " 1\">Parameters {{paramName}}, were generated automatically.\n" + "Parameter {{parameters.generated[0]}} was generated automatically.\n" + "

    \n" + "
    \n" + "Show parameter values\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/deployments.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Deployments\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "

    Deployment Configurations

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameLast VersionStatusCreatedTrigger
    {{emptyMessage}}
    \n" + "{{dcName}}\n" + "\n" + "No deployments   
    \n" + "{{dcName}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "#{{replicationController | annotation : 'deploymentVersion'}}\n" + "\n" + "\n" + "{{replicationController.metadata.name}}\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "{{replicationController | deploymentStatus}},\n" + "{{replicationController.status.replicas}}/{{replicationController.spec.replicas}} replicas\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "Unknown\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Image change\n" + "\n" + "\n" + "Config change\n" + "{{cause.type}}\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Deployments

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameLast VersionReplicasCreatedStrategy
    \n" + "{{deployment.metadata.name}}\n" + "\n" + "\n" + "{{deployment | lastDeploymentRevision}}\n" + "\n" + "\n" + "{{deployment | lastDeploymentRevision}}\n" + "\n" + "\n" + "{{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas\n" + "\n" + "\n" + "\n" + "{{deployment.spec.strategy.type | sentenceCase}}\n" + "
    \n" + "
    \n" + "
    \n" + "

    Replica Sets

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameReplicasCreated
    \n" + "{{replicaSet.metadata.name}}\n" + "\n" + "{{replicaSet.status.replicas}}/{{replicaSet.spec.replicas}} replicas\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    0\" id=\"replica-controllers\">\n" + "

    Other Replication Controllers

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameReplicasCreated
    No replication controllers to show
    \n" + "{{deployment.metadata.name}}\n" + "\n" + "{{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_build-close.html', "" ); $templateCache.put('views/directives/_build-pipeline-collapsed.html', "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "{{build.status.phase}}\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_build-pipeline-expanded.html', "
    \n" + "
    \n" + "
    \n" + "{{buildConfigName}}\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Build #{{build | annotation : 'buildNumber'}}\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    No stages have started.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "{{stage.name}}\n" + "
    \n" + "\n" + "
    \n" + "Input Required\n" + "
    \n" + "
    {{stage.durationMillis | timeOnlyDuration}}
    \n" + "
    not started
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_build-pipeline-links.html', "" ); $templateCache.put('views/directives/_click-to-reveal.html', "{{linkText || \"Show\"}}\n" + "" ); $templateCache.put('views/directives/_copy-to-clipboard.html', "
    \n" + "\n" + "
    {{inputText || clipboardText}}
    \n" + "\n" + "\n" + "\n" + "\n" + "
    " ); $templateCache.put('views/directives/_create-project-form.html', "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "A unique name for the project.\n" + "
    \n" + "
    \n" + "\n" + "Name must have at least two characters.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Project names may only contain lower-case letters, numbers, and dashes. They may not start or end with a dash.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "This name is already in use. Please choose a different name.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_custom-icon.html', "\n" + "\"\"" ); $templateCache.put('views/directives/_edit-command.html', "\n" + "

    No command set.

    \n" + "

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Remove Argument\n" + "\n" + "\n" + "\n" + "\n" + "

    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Add\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "Add\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Enter the command to run inside the container. The command is considered successful if its exit code is 0. Drag and drop command arguments to reorder them.\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "A command is required.\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_edit-probe.html', "\n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "{{item.label}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.containerPort}}\n" + "{{port.containerPort}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.containerPort}}\n" + "{{port.containerPort}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "seconds\n" + "\n" + "
    \n" + "How long to wait after the container starts before checking its health.\n" + "
    \n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "
    \n" + "Delay can't be negative.\n" + "
    \n" + "\n" + "Must be a whole number.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "seconds\n" + "\n" + "
    \n" + "How long to wait for the probe to finish. If the time is exceeded, the probe is considered failed.\n" + "
    \n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "
    \n" + "Timeout must be greater than or equal to one.\n" + "
    \n" + "\n" + "Must be a whole number.\n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_ellipsis-loader.html', "
    " ); $templateCache.put('views/directives/_ellipsis-pulser.html', "
    \n" + "{{msg}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_pod-content.html', "
    \n" + "{{pod.status.phase}}\n" + "\n" + "\n" + "\n" + "
    \n" + "scheduling...\n" + "scheduled\n" + "pulling...\n" + "
    \n" + "
    \n" + " \n" + "{{pod.status.podIP}}\n" + "\n" + " \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_probe.html', " \n" + "GET {{probe.httpGet.path || '/'}} on port {{probe.httpGet.port || 'unknown'}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Open socket on port {{probe.tcpSocket.port}}\n" + "\n" + "\n" + "{{probe.initialDelaySeconds}}s delay,\n" + "{{probe.timeoutSeconds || 1}}s timeout\n" + "" ); $templateCache.put('views/directives/_project-filter.html', "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/_status-icon.html', "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "" ); $templateCache.put('views/directives/_warnings-popover.html', "\n" + "...'}}\" data-toggle=\"popover\" data-trigger=\"hover\" data-html=\"true\" class=\"pficon warnings-popover\" ng-class=\"{'pficon-warning-triangle-o': !hasError, 'pficon-error-circle-o': hasError}\" aria-hidden=\"true\">\n" + "\n" + "{{content}}\n" + "" ); $templateCache.put('views/directives/action-chip.html', "\n" + "\n" + "{{key}}\n" + "\n" + "\n" + "{{key}}\n" + "\n" + "\n" + "{{value}}\n" + "\n" + "\n" + "{{value}}\n" + "\n" + "\n" + "\n" + "\n" + "" ); $templateCache.put('views/directives/annotations.html', "

    \n" + "Show Annotations\n" + "Hide Annotations\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{annotationKey}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    \n" + "There are no annotations on this resource.\n" + "

    \n" + "
    " ); $templateCache.put('views/directives/breadcrumbs.html', "
      \n" + "
    1. \n" + "{{breadcrumb.title}}\n" + "{{breadcrumb.title}}\n" + "{{breadcrumb.title}}\n" + "
    2. \n" + "
    " ); $templateCache.put('views/directives/build-pipeline.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/build-status.html', "\n" + "{{build.status.phase}}\n" + "{{build.status.reason | sentenceCase}}, ran for {{build.status.startTimestamp | timeOnlyDurationFromTimestamps : build.status.completionTimestamp}}, ran for {{build.status.startTimestamp | timeOnlyDurationFromTimestamps : build.status.completionTimestamp}} after {{build.status.startTimestamp | timeOnlyDurationFromTimestamps : build.status.completionTimestamp}} for , ran for {{build.status.startTimestamp | duration : build.status.completionTimestamp}}\n" + "" ); $templateCache.put('views/directives/create-secret.html', "\n" + "\n" + "
    \n" + "\n" + "\n" + "{{$select.selected | upperFirst}} Secret\n" + "\n" + "{{type | upperFirst}} Secret\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "This name is already in use. Please choose a different name.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Secret name must consist of lower-case letters, numbers, periods, and hyphens. It must start and end with a letter or number.\n" + "
    \n" + "
    \n" + "Secret name is required.\n" + "
    \n" + "
    \n" + "
    \n" + "Unique name of the new secret.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{type.label}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Optional username for Git authentication.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Password or token is required.\n" + "
    \n" + "
    \n" + "
    \n" + "Password or token for Git authentication. Required if a ca.crt or .gitconfig file is not specified.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "Private SSH key file for Git authentication.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Image registry server address is required.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Username is required.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Password is required.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Email must be in the form of user@domain.\n" + "
    \n" + "
    \n" + "Email is required.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "File with credentials and other configuration for connecting to a secured image registry.\n" + "
    \n" + "
    \n" + "\n" + "Configuration file should be in JSON format.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/delete-button.html', "" ); $templateCache.put('views/directives/delete-link.html', "{{label || 'Delete'}}" ); $templateCache.put('views/directives/deploy-image.html', "
    \n" + "

    \n" + "Deploy an existing image from an image stream tag or Docker pull spec.\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "Service account default will need image pull authority to deploy images from {{istag.namespace}}. You can grant authority with the command:\n" + "

    \n" + "oc policy add-role-to-user system:image-puller system:serviceaccount:{{project}}:default -n {{istag.namespace}}\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    Select an image stream tag or enter an image name.
    \n" + "
    Loading image metadata for {{imageName | stripSHA}}...
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Image {{import.name}} runs as the\n" + "root user which might not be permitted by your cluster administrator.\n" + "
    \n" + "

    \n" + "{{import.name}}\n" + "{{istag.imageStream}}:{{import.tag}}\n" + "\n" + "from {{import.result.ref.registry}},\n" + ",\n" + "{{import.image.dockerImageMetadata.Size | humanizeSize}},\n" + "{{import.image.dockerImageLayers.length}} layers\n" + "\n" + "

    \n" + "
      \n" + "
    • Image Stream {{app.name || \"<name>\"}}:{{import.tag || 'latest'}} will track this image.
    • \n" + "
    • This image will be deployed in Deployment Config {{app.name || \"<name>\"}}.
    • \n" + "
    • \n" + "Port\n" + " 1\">Ports\n" + "\n" + "and\n" + "{{port.containerPort}}/{{port.protocol}} 2\">,\n" + "\n" + "will be load balanced by Service {{app.name || \"<name>\"}}.\n" + "
      Other containers can access this service through the hostname {{app.name || \"<name>\"}}.
      \n" + "
    • \n" + "
    \n" + "
    0\" class=\"help-block\">\n" + "This image declares volumes and will default to use non-persistent, host-local storage. You can add persistent storage later to the deployment config.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    Identifies the resources created for this image.
    \n" + "
    \n" + "
    \n" + "A name is required.\n" + "
    \n" + "
    \n" + "Name must be an alphanumeric (a-z, 0-9) string with a maximum length of 24 characters where the first character is a letter (a-z). The '-' character is allowed anywhere except the first or last character.\n" + "
    \n" + "
    \n" + "Name must have at least 2 characters.\n" + "
    \n" + "
    \n" + "Name can't have more than 24 characters.\n" + "
    \n" + "
    \n" + "
    \n" + "This name is already in use within the project. Please choose a different name.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "Could not load image metadata.\n" + "

    \n" + "

    {{import.error | upperFirst}}

    \n" + "
    \n" + "
    \n" + "

    \n" + "No image metadata found.\n" + "

    \n" + "

    Could not find any images for {{import.name | stripTag}}:{{import.tag}}.

    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/deployment-donut.html', "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "Scale down\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Autoscaled:\n" + "min: {{hpa[0].spec.minReplicas || 1}},\n" + "\n" + "max: {{hpa[0].spec.maxReplicas}}\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Quota\n" + "limit reached.\n" + "
    \n" + "
    \n" + "Scaling may be affected.\n" + "Check events\n" + "Check events\n" + "
    \n" + "\n" + "
    " ); $templateCache.put('views/directives/deployment-metrics.html', "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "{{options.selectedContainer.name}}\n" + "\n" + " 1\" ng-model=\"options.selectedContainer\" input-id=\"selectContainer\">\n" + "{{$select.selected.name}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{range.label}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "No metrics to display.\n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "Metrics are not available.\n" + "

    \n" + "

    \n" + "An error occurred getting metrics\n" + "for container {{options.selectedContainer.name}}\n" + "from {{metricsURL}}.\n" + "

    \n" + "

    \n" + "{{metricsError.details}}\n" + "

    \n" + "
    \n" + "
    \n" + "

    \n" + "{{metric.label}}\n" + "\n" + "Average per pod\n" + "\n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/edit-config-map.html', "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "A unique name for the config map within the project.\n" + "
    \n" + "
    \n" + "\n" + "Config map names may only contain lower-case letters, numbers, and dashes. They may not start or end with a dash.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Config map names may not be longer than 63 characters.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    The config map has no items.

    \n" + "Add Item\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "A unique key for this config map entry.\n" + "
    \n" + "
    \n" + "\n" + "Duplicate key \"{{item.key}}\". Keys must be unique within the config map.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Config map keys may only consist of letters, numbers, periods, hyphens, and underscores.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Config map keys may not be longer than 253 characters.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Remove Item\n" + "\n" + "|\n" + "Add Item\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/edit-lifecycle-hook.html', "\n" + "
    \n" + "
    Pre hooks execute before the deployment begins.
    \n" + "
    Mid hooks execute after the previous deployment is scaled down to zero and before the first pod of the new deployment is created.
    \n" + "
    Post hooks execute after the deployment strategy completes.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "Runs a command in a new pod using the container from the deployment template. You can add additional environment variables and volumes.\n" + "Tags the current image as an image stream tag if the deployment succeeds.\n" + "Learn More \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "Environment variables to supply to the hook pod's container.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$item}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "List of named volumes to copy to the hook pod.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Use the image for this container as the source of the tag.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    1\">\n" + "

    \n" + "\n" + "More than one image tag is defined. To change image tags, use the YAML editor.\n" + "

    \n" + "{{tagImage.containerName}} → {{tagImage.to.namespace || namespace}}/{{tagImage.to.name}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "{{failurePolicyTypes}}\n" + "\n" + "\n" + "
    \n" + "
    Retry the hook until it succeeds.
    \n" + "
    Fail the deployment if the hook fails.
    \n" + "
    Ignore hook failures and continue the deployment.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Add {{type | upperFirst}} Lifecycle Hook\n" + "Remove {{type | upperFirst}} Lifecycle Hook\n" + "\n" + "
    " ); $templateCache.put('views/directives/edit-webhook-triggers.html', "
    {{type}} webhooks\n" + "\n" + "\n" + "{{typeInfo}}\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Remove\n" + "\n" + "\n" + "\n" + "Undo\n" + "\n" + "\n" + "\n" + "Remove\n" + "Undo\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Add {{type}} Webhook\n" + "" ); $templateCache.put('views/directives/environment.html', "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameValue
    {{env.name}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Set to the key {{value.key}} in config map {{value.name}}.\n" + "\n" + "\n" + "Set to the key {{value.key}} in secret {{value.name}}.\n" + "\n" + "\n" + "Set to the field {{value.fieldPath}} in the current object.\n" + "\n" + "\n" + "Set to a reference on a {{key}}.\n" + "\n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/events-badge.html', "EventsWarning{{warningCount}}Normal{{normalCount}}\n" + "Expand event sidebarEventsWarning{{warningCount}}Normal{{normalCount}}" ); $templateCache.put('views/directives/events-sidebar.html', "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Collapse event sidebar\n" + "Events\n" + "\n" + "\n" + "{{warningCount}}\n" + "\n" + "warning\n" + " 1\">warnings\n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "View Details\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "No events.\n" + "
    \n" + "
    \n" + "{{event.type}}\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "{{event.reason | sentenceCase}}\n" + "
    \n" + "
    \n" + "{{event.involvedObject.kind | kindToResource | abbreviateResource}}/{{event.involvedObject.name}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "{{event.message}}\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    1\" class=\"text-muted small\">\n" + "{{event.count}} times in the last\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/events.html', "
    \n" + "Loading...\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Sort by\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Time\n" + "Kind and Name\n" + "Name\n" + "\n" + "Kind\n" + "SeverityReasonReason and Message
    \n" + "No events to show.\n" + " 0\">\n" + "All events hidden by filter.\n" + "Clear Filter\n" + "\n" + "\n" + "No events to show.\n" + " 0\">\n" + "All events hidden by filter.\n" + "Clear Filter\n" + "\n" + "
    {{event.lastTimestamp | date:'mediumTime'}}\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "{{event.type}}\n" + "\n" + " \n" + "\n" + "
    \n" + " \n" + "\n" + "
    \n" + "\n" + "
    1\" class=\"text-muted small\">\n" + "{{event.count}} times in the last\n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/from-file.html', "

    \n" + "Create or replace resources from their YAML or JSON definitions. If adding a template, you'll have the option to process the template.\n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "Cancel\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/header/_navbar-utility-mobile.html', "" ); $templateCache.put('views/directives/header/_navbar-utility.html', "" ); $templateCache.put('views/directives/header/default-header.html', "" ); $templateCache.put('views/directives/header/project-header.html', "" ); $templateCache.put('views/directives/hpa.html', "

    \n" + "{{hpa.metadata.name}}\n" + "\n" + "\n" + "Edit\n" + "|\n" + "\n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    {{hpa.spec.scaleRef.kind | humanizeKind : true}}:
    \n" + "
    \n" + "{{hpa.spec.scaleRef.name}}\n" + "
    \n" + "
    Min Pods:
    \n" + "
    {{hpa.spec.minReplicas || 1}}
    \n" + "
    Max Pods:
    \n" + "
    {{hpa.spec.maxReplicas}}
    \n" + "
    \n" + "CPU\n" + "Limit\n" + "Request\n" + "Target:\n" + "
    \n" + "
    {{hpa.spec.cpuUtilization.targetPercentage | hpaCPUPercent : project}}%
    \n" + "
    \n" + "Current Usage:\n" + "
    \n" + "
    \n" + "Not available\n" + "
    \n" + "
    \n" + "{{hpa.status.currentCPUUtilizationPercentage | hpaCPUPercent : project}}%\n" + "
    \n" + "
    Last Scaled:
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/istag-select.html', "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    /
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    :
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.tag}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/label-editor.html', "\n" + "
    \n" + "
    \n" + "The following labels are being added automatically. If you want to override them, you can do so below.\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "{{helpText}}\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/labels.html', "
    0\">\n" + "\n" + "\n" + "{{labelKey}}{{labelValue}}<empty>\n" + "\n" + "\n" + "{{labelKey}}{{labelValue}}\n" + "\n" + "\n" + "More labels...\n" + "
    " ); $templateCache.put('views/directives/lifecycle-hook.html', "

    \n" + "{{type | upperFirst}} Hook\n" + "\n" + "– runs before the deployment begins\n" + "– runs after the previous deployment is scaled down to zero and before the first pod of the new deployment is created\n" + "– runs after the deployment strategy completes\n" + "\n" + "

    \n" + "
    \n" + "
    Action:
    \n" + "
    {{strategyParams[type].execNewPod ? \"Run a command\" : \"Tag the image\"}}
    \n" + "
    Failure Policy:
    \n" + "
    {{strategyParams[type].failurePolicy}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    Container {{strategyParams[type].execNewPod.containerName}}
    \n" + "
    \n" + "
    Command:
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    Environment Variables:
    \n" + "
    \n" + "
    \n" + "
    {{env.name}}={{env.value}}
    \n" + "
    \n" + "
    \n" + "
    Volumes:
    \n" + "
    \n" + "
    \n" + "{{volume}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    Container {{tagImage.containerName}}
    \n" + "
    \n" + "
    Tag image as {{tagImage.to | imageObjectRef : deploymentConfig.metadata.namespace}}\n" + "{{tagImage.to | imageObjectRef : deploymentConfig.metadata.namespace}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/logs/_log-raw.html', "
    \n" +
        "\n" +
        "{{::log}}\n" +
        "\n" +
        "
    " ); $templateCache.put('views/directives/logs/_log-viewer.html', "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "|\n" + "
    \n" + "\n" + "\n" + "Save\n" + "\n" + "|\n" + "\n" + "\n" + "Expand\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Only the previous {{options.tailLines || 5000}} log lines and new log messages will be displayed because of the large log size.\n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Logs are not available.

    \n" + "

    \n" + "{{emptyStateMessage}}\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "End of log\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "Go to Top\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "The maximum web console log size has been reached. Use the command-line interface or\n" + "reload the log to see new messages.\n" + "
    \n" + "
    \n" + "An error occurred loading the log.\n" + "Reload\n" + "
    " ); $templateCache.put('views/directives/metrics-compact.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{metric.formatUsage(metric.lastValue)}}\n" + "\n" + "\n" + "--\n" + "\n" + "
    \n" + "
    \n" + "{{metric.usageUnits(metric.lastValue) | capitalize}} {{metric.compactLabel || metric.label}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-autoscaling.html', "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "A unique name for the horizontal pod autoscaler within the project.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "A name is required.\n" + "\n" + "\n" + "Autoscaler names may only contain lower-case letters, numbers, and dashes. They may not start or end with a dash.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "The lower limit for the number of pods that can be set by the autoscaler. If not specified, defaults to 1.\n" + "
    \n" + "
    \n" + "\n" + "Min pods must be a number.\n" + "\n" + "\n" + "Min pods must be a whole number.\n" + "\n" + "\n" + "Min pods must be greater than or equal to 1.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "The upper limit for the number of pods that can be set by the autoscaler.\n" + "
    \n" + "
    \n" + "\n" + "Max pods must be a number.\n" + "\n" + "\n" + "Min pods must be a whole number.\n" + "\n" + "\n" + "Max pods must be greater than or equal to\n" + "min pods, which is\n" + "{{autoscaling.minReplicas || 1}.\n" + "\n" + "\n" + "Max pods is a required field.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "%\n" + "
    \n" + "
    \n" + "The percentage of the CPU\n" + "limit\n" + "request\n" + "that each pod should ideally be using. Pods will be added or removed periodically when CPU usage exceeds or drops below this target value. Defaults to {{defaultTargetCPUDisplayValue}}%.\n" + "
    \n" + "
    \n" + "Learn More \n" + "
    \n" + "\n" + "
    \n" + "\n" + "Target CPU percentage must be a number.\n" + "\n" + "\n" + "Target CPU percentage must be a whole number.\n" + "\n" + "\n" + "Target CPU percentage must be greater than 1.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-file-input.html', "
    \n" + "
    \n" + "

    Drop file here

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "Browse…\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "{{::helpText}}\n" + "
    \n" + "
    \n" + "There was an error reading the file. Please copy the file content into the text area.\n" + "
    \n" + "\n" + "Clear Value\n" + "
    " ); $templateCache.put('views/directives/osc-form-section.html', "
    \n" + "
    \n" + "

    {{header}}

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-image-summary.html', "

    {{ name || (resource | displayName) }}

    \n" + "
    \n" + "
    \n" + "
    Provider: {{ resource | annotation:'provider' }}
    \n" + "
    Namespace: {{ resource.metadata.namespace }}
    \n" + "
    Version: {{ resource | annotation:'version' }}
    \n" + "
    " ); $templateCache.put('views/directives/osc-key-values.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "Add\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Please add or clear this {{(keyTitle || 'key') | lowercase}}-{{(valueTitle || 'value') | lowercase}} pair\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Duplicate {{(keyTitle || 'key') | lowercase}}: {{key}}\n" + "\n" + "
    \n" + "
    \n" + "Please enter a valid {{setErrorText(keyValidator)}}\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "Please enter a valid value\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    {{key}}
    \n" + "
    {{value}}
    \n" + "
    \n" + " \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    {{key}}
    \n" + "
    \n" + "{{value}}\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    None
    \n" + "
      \n" + "
    • \n" + "{{key}}\n" + "{{ value }}\n" + "
    • \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-object-describer.html', "
    \n" + "
    \n" + "

    Select an object to see more details.

    \n" + "\n" + "

    A pod contains one or more Docker containers that run together on a node, containing your application code.

    \n" + "

    A service groups pods and provides a common DNS name and an optional, load-balanced IP address to access them.

    \n" + "

    A deployment is an update to your application, triggered by a changed image or configuration.

    \n" + "
    \n" + "
    \n" + "\n" + "
    " ); $templateCache.put('views/directives/osc-persistent-volume-claim.html', "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "Storage classes are set by the administrator to define types of storage the users can select.\n" + "
    \n" + "Learn More \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "Type: {{sclass.parameters.type}} | Zone: {{sclass.parameters.zone}}\n" + " | {{sclass.metadata.annotations.description}}\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "A unique name for the storage claim within the project.\n" + "
    \n" + "
    \n" + "\n" + "Claim names may only contain lower-case letters, numbers, and dashes. They may not start or end with a dash. Max length of 253.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "Permissions to the mounted volume.\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{option.label}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Desired storage capacity.\n" + "
    \n" + "
    \n" + "\n" + "Must be a positive integer.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "Use\n" + "label selectors\n" + "to request storage.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "Enter a label and value to use for your storage.\n" + "
    \n" + "Learn More \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-routing-service.html', "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.metadata.name}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Service to route to.\n" + "Alternate service for route traffic.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "There are no additional services in your project to expose with a route.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Service {{route.service.metadata.name}} has a single, unnamed port. A route cannot specifically target an unnamed service port. If more service ports are added later, the route will also direct traffic to them.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "Weight is a number between 0 and 256 that specifies the relative weight against other route services.\n" + "\n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "\n" + "
    \n" + "Must be a whole number greater than or equal to 0.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-routing.html', "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "A unique name for the route within the project.\n" + "
    \n" + "
    \n" + "\n" + "Route names may only contain lower-case letters, numbers, and dashes. They may not start or end with a dash.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "

    \n" + "Public hostname for the route.\n" + "\n" + "If not specified, a hostname is generated.\n" + "\n" + "\n" + "You can use *.example.com with routers that support wildcard subdomains.\n" + "\n" + "

    \n" + "

    The hostname can't be changed after the route is created.

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Hostname must consist of lower-case letters, numbers, periods, and hyphens. It must start and end with a letter or number.\n" + "Wildcard subdomains may start with *.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "Path that the router watches to route traffic to the service.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Path must start with /\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Path value will not be used. Paths cannot be set for passthrough TLS.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + " 1 || (controls.hideSlider && route.alternateServices.length)\">\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{portOption.label}}\n" + "\n" + "\n" + "
    \n" + "\n" + "Target port for traffic.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Alternate Services

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "Routes can direct traffic to multiple services for A/B testing. Each service has a weight controlling how much traffic it gets.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + " 1 || controls.hideSlider\">\n" + "\n" + "Remove Service\n" + "\n" + "|\n" + "Add Another Service\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Service {{duplicate.metadata.name}} cannot be added twice.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Service Weights

    \n" + "
    \n" + "
    \n" + "
    \n" + "{{route.to.service.metadata.name}}\n" + "{{weightAsPercentage(route.to.weight, true)}}\n" + "
    \n" + "
    \n" + "{{weightAsPercentage(route.alternateServices[0].weight, true)}}\n" + "{{route.alternateServices[0].service.metadata.name}}\n" + "{{weightAsPercentage(route.alternateServices[0].weight, true)}}\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "Percentage of traffic sent to each service. Drag the slider to adjust the values or\n" + "edit weights as integers.\n" + "
    \n" + "
    \n" + "
    \n" + "

    Security

    \n" + "
    \n" + "\n" + "
    \n" + "Routes can be secured using several TLS termination types for serving certificates.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "{{$select.selected | humanizeTLSTermination}}\n" + "\n" + "{{option | humanizeTLSTermination}}\n" + "\n" + "\n" + "
    \n" + "Learn More \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{option.label}}\n" + "\n" + "\n" + "
    \n" + "\n" + "Policy for traffic on insecure schemes like HTTP for edge termination.\n" + "\n" + "
    \n" + "
    \n" + "\n" + "

    Certificates

    \n" + "
    \n" + "TLS certificates for edge and re-encrypt termination. If not specified, the router's default certificate is used.\n" + "
    \n" + "
    \n" + "\n" + "The certificate or key you've set will not be used.\n" + "\n" + "The route is unsecured.\n" + "\n" + "\n" + "Custom certificates cannot be used with passthrough termination.\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "The destination CA certificate will be removed from the route. Destination CA certificates are only used for re-encrypt termination.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-secrets.html', "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Secret with credentials for pulling your source code.\n" + "Learn More \n" + "
    \n" + "
    \n" + "Secret for authentication when pulling images from a secured registry.\n" + "Learn More \n" + "
    \n" + "
    \n" + "Secret for authentication when pushing images to a secured registry.\n" + "Learn More \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Add Another Secret\n" + "|\n" + "\n" + "Create New Secret\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/osc-source-secrets.html', "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Source secret to copy into the builder pod at build time.
    \n" + "
    Directory where the files will be available at build time.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "{{$select.selected}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    Source secret to mount into the builder pod at build time.
    \n" + "
    Path at which to mount the secret.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Add Another Secret\n" + "|\n" + "\n" + "Create New Secret\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/pipeline-status.html', "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/pod-donut.html', "
    \n" + "\n" + "
    \n" + "
    No pods.
    \n" + "
    \n" + "Pod status:\n" + "{{column[1]}} {{column[0]}}\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/pod-metrics.html', "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "{{pod.spec.containers[0].name}}\n" + "\n" + " 1\" ng-model=\"options.selectedContainer\" input-id=\"selectContainer\">\n" + "{{$select.selected.name}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "{{$select.selected.label}}\n" + "\n" + "{{range.label}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    No metrics to display.
    \n" + "
    \n" + "

    \n" + "\n" + "Metrics are not available.\n" + "

    \n" + "

    \n" + "An error occurred getting metrics\n" + "for container {{options.selectedContainer.name}}\n" + "from {{metricsURL}}.\n" + "

    \n" + "

    \n" + "{{metricsError.details}}\n" + "

    \n" + "
    \n" + "
    \n" + "

    \n" + "{{metric.label}}\n" + " 1\">\n" + "Container Metrics\n" + "Pod Metrics\n" + "\n" + "

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    = 0\">\n" + "

    \n" + "{{metric.datasets[0].available}}\n" + "

    \n" + "
    \n" + "
    Available of
    \n" + "
    {{metric.datasets[0].total}} {{metric.units}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "{{metric.datasets[0].available | abs}}\n" + "

    \n" + "
    \n" + "
    Over limit of
    \n" + "
    {{metric.datasets[0].total}} {{metric.units}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/pods-table.html', "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{customNameHeader || 'Name'}}StatusContainers ReadyContainer RestartsAgeReceiving Traffic
    {{emptyMessage || 'No pods to show'}}
    \n" + "{{pod.metadata.name}}\n" + "\n" + "\n" + "Debugging pod {{pod | debugPodSourceName}}\n" + "\n" + "\n" + "
    \n" + "\n" + "{{pod | podStatus | sentenceCase}}\n" + "
    \n" + "
    {{pod | numContainersReady}}/{{pod.spec.containers.length}}{{pod | numContainerRestarts}}\n" + "\n" + "\n" + "Yes\n" + "\n" + "\n" + "\n" + "\n" + "No\n" + "\n" + "\n" + "
    " ); $templateCache.put('views/directives/replicas.html', "\n" + "{{spec}} replicas\n" + "{{status}} current / {{spec}} desired\n" + "\n" + "\n" + "Edit\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Scale\n" + "\n" + "\n" + "\n" + "Cancel\n" + "\n" + "
    \n" + "
    \n" + "A value for replicas is required.\n" + "
    \n" + "
    \n" + "Replicas must be a whole number.\n" + "
    \n" + "
    \n" + "Replicas can't be negative.\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/select-containers.html', "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "{{helpText}}\n" + "
    \n" + "
    \n" + "\n" + "You must select at least one container.\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/directives/selector.html', "
    none
    \n" + "
    \n" + "
    \n" + "
    \n" + "{{selectorLabel}}={{selectorValue}}\n" + "
    \n" + "
    \n" + "{{requirement.key}} {{requirement.operator | startCase | lowercase}}\n" + "\n" + "({{value}}, )\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "{{selectorLabel}}={{selectorValue}}\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/directives/service-group-notifications.html', "" ); $templateCache.put('views/directives/traffic-table.html', " \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{customNameHeader || 'Route'}} / Node PortService PortTarget PortHostnameTLS Termination
    {{emptyMessage || 'No routes or ports to show'}}
    \n" + "{{routes[routeName].metadata.name}}\n" + "\n" + "\n" + "\n" + " / {{port.nodePort}}\n" + "\n" + "\n" + "{{port.port}}/{{port.protocol}}\n" + "({{port.name}})\n" + "\n" + "{{port.targetPort}}\n" + "\n" + "\n" + "{{routes[routeName] | routeLabel}}\n" + "\n" + "\n" + "{{routes[routeName] | routeLabel}}\n" + "\n" + "\n" + "\n" + "Pending\n" + "\n" + "\n" + "{{routes[routeName].spec.tls.termination | humanizeTLSTermination}}\n" + " \n" + "
    \n" + "none\n" + "{{port.nodePort}}\n" + "\n" + "{{port.port}}/{{port.protocol}}\n" + "({{port.name}})\n" + "\n" + "{{port.targetPort}}\n" + "none\n" + "none\n" + "
    " ); $templateCache.put('views/directives/truncate-long-text.html', "{{content}}\n" + "\n" + "\n" + "{{truncatedContent}}…\n" + "See all\n" + "\n" + "\n" + "
    \n" + "Collapse\n" + "{{content | prettifyJSON}}\n" + "
    \n" + "\n" + "Collapse\n" + "{{content}}\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/edit/autoscaler.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "Loading...\n" + "
    \n" + "
    \n" + "

    \n" + "Autoscale {{targetKind | humanizeKind : true}} {{targetName}}\n" + "

    \n" + "
    \n" + "Scale replicas automatically based on CPU usage.\n" + "
    \n" + "
    \n" + "Learn More  \n" + "
    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "Metrics might not be configured by your cluster administrator. Metrics are required for autoscaling.\n" + "
    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "This {{targetKind | humanizeKind}} does not have any containers with a CPU\n" + "limit\n" + "request\n" + "set. Autoscaling will not work without a CPU\n" + "limit.\n" + "request.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/build-config.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "

    \n" + "Edit Build Config {{buildConfig.metadata.name}}\n" + "— {{strategyType | startCase}} Build Strategy\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Source Configuration

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "Git URL of the source code to build.\n" + "If your Git repository is private, view the advanced options to set up authentication.\n" + "
    \n" + "
    \n" + "A Git repository URL is required.\n" + "
    \n" + "
    \n" + "This might not be a valid Git URL. Check that it is the correct URL to a remote Git repository.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    Optional branch, tag, or commit.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    Optional subdirectory for the application source code, used as the context directory for the build.
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected | startCase}}\n" + "\n" + "{{type | startCase}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "{{selectTypes[fromObject.kind]}}: {{fromObject | imageObjectRef : buildConfig.metadata.namespace}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "There are no editable source types for this build config.\n" + "
    \n" + "
    \n" + "
    \n" + "

    Jenkins Pipeline Configuration

    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.title}}\n" + "\n" + "{{type.title}}\n" + "\n" + "\n" + "
    \n" + "Use a Jenkinsfile from the source repository or specify the Jenkinsfile content directly in the build configuration.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "Optional path to the Jenkinsfile relative to the context dir. Defaults to the Jenkinsfile in context dir.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "What's a Jenkinsfile?\n" + "
    \n" + "
    \n" + "
    \n" + "Hide examples\n" + "
    \n" + "

    Jenkinsfile Examples

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "No source inputs have been defined for this build configuration.\n" + "
    \n" + "
    \n" + "
    \n" + "

    Image Configuration

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected | startCase}}\n" + "\n" + "{{type | startCase}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected | startCase}}\n" + "\n" + "{{type | startCase}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Environment Variables\n" + "\n" + "\n" + "\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Triggers\n" + "Learn More \n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    Image change
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Build Secrets\n" + "Learn More \n" + "

    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    Run Policy\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "

    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected | sentenceCase}}\n" + "\n" + "{{type | sentenceCase}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    Builds triggered from this Build Configuration will run one at the time, in the order they have been triggered.
    \n" + "
    Builds triggered from this Build Configuration will run all at the same time. The order in which they will finish is not guaranteed.
    \n" + "
    Builds triggered from this Build Configuration will run one at the time. When a currently running build completes, the next build that will run is the latest build created. Other queued builds will be cancelled.
    \n" + "
    Builds triggered from this Build Configuration will run using the {{updatedBuildConfig.spec.runPolicy | sentenceCase}} policy.
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "Cancel\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/config-map.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "

    Edit Config Map {{configMap.metadata.name}}

    \n" + "
    \n" + "Config maps hold key-value pairs that can be used in pods to read application configuration.\n" + "
    \n" + "
    \n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "\n" + "Warning:\n" + "Config map {{configMap.metadata.name}} has changed since you started editing it. You'll need to copy any changes you've made and edit the config map again.\n" + "
    \n" + "
    \n" + "\n" + "Warning:\n" + "Config map {[configMap.metadata.name}} has been deleted since you started editing it.\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/deployment-config.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    \n" + "Edit Deployment Config {{deploymentConfig.metadata.name}}\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Deployment Strategy

    \n" + "
    \n" + "{{strategyParamsName}}\n" + "
    \n" + "\n" + "\n" + "{{$select.selected}}\n" + "\n" + "{{strategyType}}\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "The recreate strategy has basic rollout behavior and supports lifecycle hooks for injecting code into the deployment process.\n" + "Learn More \n" + "\n" + "\n" + "The rolling strategy will wait for pods to pass their readiness check, scale down old components and then scale up.\n" + "Learn More \n" + "\n" + "\n" + "The custom strategy allows you to specify container image that will provide your own deployment behavior.\n" + "Learn More \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    An image that can carry out the deployment.
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "seconds\n" + "\n" + "
    \n" + "How long to wait for a pod to scale up before giving up.\n" + "
    \n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "
    \n" + "Timeout can't be negative.\n" + "
    \n" + "\n" + "Must be a whole number.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "seconds\n" + "\n" + "
    \n" + "Time to wait between retrying to run individual pod.\n" + "
    \n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "
    \n" + "Update period can't be negative.\n" + "
    \n" + "\n" + "Must be a whole number.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "seconds\n" + "\n" + "
    \n" + "Time to wait between polling deployment status after running a pod.\n" + "
    \n" + "
    \n" + "
    \n" + "Must be a number.\n" + "
    \n" + "
    \n" + "Interval can't be negative.\n" + "
    \n" + "\n" + "Must be a whole number.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "The maximum number of pods that can be unavailable during the rolling deployment. This can be either a percentage (10%) or a whole number (1).\n" + "
    \n" + "
    \n" + "\n" + "Must be a non-negative whole number or percentage.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "The maximum number of pods that can be scheduled above the original number of pods while the rolling deployment is in progress. This can be either a percentage (10%) or a whole number (1).\n" + "
    \n" + "
    \n" + "\n" + "Must be a non-negative whole number or percentage.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Pre Lifecycle Hook

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Mid Lifecycle Hook

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Post Lifecycle Hook

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    To set additional parameters or edit lifecycle hooks, view advanced strategy options.
    \n" + "Hide Advanced Strategy Options\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Images

    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Container {{containerName}}

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    To set secrets for pulling your images from private image registries, view advanced image options.
    \n" + "Hide Advanced Image Options\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Environment Variables

    \n" + "
    \n" + "
    \n" + "

    Container {{containerName}}

    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "Cancel\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/health-checks.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    Health Checks: {{name}}

    \n" + "
    \n" + "Container health is periodically checked using readiness and liveness probes.\n" + "
    \n" + "Learn More \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    1\">Container {{container.name}}

    \n" + "

    Readiness Probe

    \n" + "
    \n" + "A readiness probe checks if the container is ready to handle requests. A failed readiness probe means that a container should not receive any traffic from a proxy, even if it's running.\n" + "
    \n" + "
    \n" + "Add Readiness Probe\n" + "
    \n" + "
    \n" + "\n" + "\n" + "

    \n" + "Remove Readiness Probe\n" + "

    \n" + "
    \n" + "

    Liveness Probe

    \n" + "
    \n" + "A liveness probe checks if the container is still running. If the liveness probe fails, the container is killed.\n" + "
    \n" + "
    \n" + "Add Liveness Probe\n" + "
    \n" + "
    \n" + "\n" + "\n" + "

    \n" + "Remove Liveness Probe\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/jenkinsfile-examples.html', "
    \n" + "

    \n" + "A Jenkinsfile is a Groovy script that defines your pipeline. In the Jenkinsfile, you can declare pipeline stages and run one or more steps within each stage. Here are some examples you can use in your pipelines.\n" + "

    \n" + "

    \n" + "Run an OpenShift build and deployment:\n" + "\n" + "\n" + "

    \n" + "

    \n" + "Checkout source code and run shell commands on a node labelled maven:\n" + "\n" + "\n" + "

    \n" + "

    \n" + "Prompt for manual input:\n" + "\n" + "\n" + "

    \n" + "

    \n" + "Learn more about\n" + "Pipeline Builds\n" + "and the\n" + "OpenShift Pipeline Plugin.\n" + "

    \n" + "
    " ); $templateCache.put('views/edit/project.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Edit Project {{project.metadata.name}}

    \n" + "
    Update the display name and description of your project. The project's unique name cannot be modified.
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/route.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "

    Edit Route {{routeName}}

    \n" + "
    \n" + "Loading...\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/edit/yaml.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    Edit {{resource.kind | humanizeKind : true}} {{resource.metadata.name}}

    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "{{resource.kind | humanizeKind | upperFirst}} {{resource.metadata.name}} has changed since you started editing it. You'll need to copy any changes you've made and edit the {{resource.kind | humanizeKind}} again.\n" + "
    \n" + "
    \n" + "\n" + "Warning:\n" + "{{resource.kind | humanizeKind | upperFirst}} {{resource.metadata.name}} has been deleted since you started editing it.\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/events.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Events

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/images.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Image Streams\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameDocker RepoTagsUpdated
    {{emptyMessage}}
    {{imageStream.metadata.name}}\n" + "unknown\n" + "{{imageStream.status.dockerImageRepository || imageStream.spec.dockerImageRepository}}\n" + "\n" + "none\n" + "{{tag.tag}},\n" + ", {{imageStream.status.tags[4].tag}} 5\">, and {{imageStream.status.tags.length - 4}} others\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/logs/chromeless-build-log.html', "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/logs/chromeless-deployment-log.html', "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/logs/chromeless-pod-log.html', "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/logs/textonly_log.html', " " ); $templateCache.put('views/membership.html', "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "Edit Membership\n" + "Done Editing\n" + "\n" + "Membership\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    You do not have permission to view roles in this project.

    \n" + "
    \n" + "\n" + "\n" + "\n" + "{{subjectKind.name | startCase}}s ({{subjectKind.subjects | hashSize}})\n" + "\n" + "
    \n" + "

    \n" + "{{subjectKind.description}}\n" + "\n" + "Learn More \n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Name

    \n" + "
    \n" + "
    \n" + "

    Roles

    \n" + "
    \n" + "
    \n" + "

    \n" + "Add Another Role\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "There are no {{ subjectKind.name | humanizeKind }}s with access to this project.\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{subject.namespace}} /\n" + "\n" + "\n" + "{{subject.name}}\n" + "\n" + "\n" + "\n" + "\n" + "{{subject.name}}\n" + "\n" + "\n" + "(you)\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{ role.metadata.name }}
    \n" + "
    \n" + "{{role | annotation : 'description'}}\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    {{ role.metadata.name }}
    \n" + "
    \n" + "{{role | annotation : 'description'}}\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
     
    \n" + "
    \n" + "
     
    \n" + "
    \n" + "
    \n" + " \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/modals/about-compute-units-modal.html', "
    \n" + "
    \n" + "

    \n" + "Compute Resources\n" + "\n" + "Learn More \n" + "\n" + "

    \n" + "
    \n" + "Each container running on a node uses compute resources like CPU and memory. You can specify how much CPU and memory a container needs to improve scheduling and performance.\n" + "
    \n" + "

    CPU

    \n" + "

    \n" + "CPU is often measured in units called millicores. Each millicore is equivalent to 11000 of a CPU core.\n" + "

    \n" + "
    \n" +
        "1000 millcores  =  1 core\n" +
        "
    \n" + "

    Memory

    \n" + "

    \n" + "Memory is measured in binary units like KiB, MiB, and GiB or decimal units like kB, MB, and GB.\n" + "

    \n" + "
    \n" + "
    \n" + "

    Binary Units

    \n" + "
    \n" +
        "1024 bytes  =  1 KiB\n" +
        "1024 KiB    =  1 MiB\n" +
        "1024 MiB    =  1 GiB\n" +
        "
    \n" + "
    \n" + "
    \n" + "

    Decimal Units

    \n" + "
    \n" +
        "1000 bytes  =  1 kB\n" +
        "1000 kB     =  1 MB\n" +
        "1000 MB     =  1 GB\n" +
        "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/confirm-replace.html', "
    \n" + "
    \n" + "
    \n" + "

    {{resourceKind}} '{{resourceName}}' already exists

    \n" + "

    Do you want to replace with the new content?

    \n" + "
    \n" + "
    \n" + "

    Some items already exist:

    \n" + "
    \n" + "
    {{resource.kind}}
    \n" + "
    {{resource.metadata.name}}
    \n" + "
    \n" + "

    Do you want to replace the existing resources?

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/confirm-save-log.html', "
    \n" + "
    \n" + "

    Save partial log for {{object.metadata.name}}?

    \n" + "
    \n" + "The log might not be complete. Continuing will save only the content currently displayed.\n" + "To get the complete log, run the command\n" + "
    \n" + "\n" + "
    \n" + "Learn more about the command line tools.\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/confirm.html', "
    \n" + "
    \n" + "

    {{message}}

    \n" + "

    {{details}}

    \n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/confirmScale.html', "
    \n" + "
    \n" + "

    Scale down {{type}} {{resource | displayName}}?

    \n" + "

    \n" + "Are you sure you want to scale {{resource | displayName}} to 0 replicas? This will stop all pods for the {{type}}.\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/create-secret.html', "
    \n" + "
    \n" + "

    \n" + "Create {{type | capitalize}} Secret\n" + "\n" + "Learn More \n" + "Learn More \n" + "Learn More \n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/debug-terminal.html', "
    \n" + "
    \n" + "

    Debug Container {{container.name}}

    \n" + "\n" + "{{debugPod.metadata.name}} —\n" + "\n" + "{{debugPod | podStatus | sentenceCase}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "

    \n" + "Waiting for container {{container.name}} to start...\n" + "

    \n" + "\n" + "
    \n" + "

    \n" + "\n" + "Could not start container {{container.name}}.\n" + "

    \n" + "

    \n" + "An error occurred starting the debug pod.\n" + "{{containerState.terminated.message}}\n" + "Exit code: {{containerState.terminated.exitCode}}\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "This temporary pod has a modified entrypoint command to debug a failing container. The pod will be available for one hour and will be deleted when the terminal window is closed.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/delete-project.html', "
    \n" + "
    \n" + "

    Are you sure you want to delete the project '{{project | displayName}}'?

    \n" + "

    This will delete all resources associated with the project {{project | displayName}} and cannot be undone. Make sure this is something you really want to do!

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/delete-resource.html', "
    \n" + "\n" + "
    \n" + "
    \n" + "

    Are you sure you want to delete the {{typeDisplayName || (kind | humanizeKind)}} '{{displayName ? displayName : resourceName}}'?

    \n" + "
    \n" + "\n" + "Warning:\n" + "{{resourceName}} has running pods. Deleting the {{typeDisplayName || (kind | humanizeKind)}} will not delete the pods it controls. Consider scaling the {{typeDisplayName || (kind | humanizeKind)}} down to 0 before continuing.\n" + "
    \n" + "

    This will delete all resources associated with the project {{displayName ? displayName : resourceName}} and cannot be undone. Make sure this is something you really want to do!

    \n" + "
    \n" + "

    Type the name of the {{typeDisplayName || (kind | humanizeKind)}} to confirm.

    \n" + "

    \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "Note: None of the replica sets created by this deployment will be deleted. To delete the deployment and all of its replica sets, you can run the command\n" + "
    oc delete deployment {{resourceName}} -n {{projectName}}
    \n" + "Learn more about the command line tools.\n" + "
    \n" + "
    \n" + "Note: None of the deployments created by this deployment config will be deleted. To delete the deployment config and all of its deployments, you can run the command\n" + "
    oc delete dc {{resourceName}} -n {{projectName}}
    \n" + "Learn more about the command line tools.\n" + "
    \n" + "
    \n" + "Note: None of the builds created by this build config will be deleted. To delete the build config and all of its builds, you can run the command\n" + "
    oc delete bc {{resourceName}} -n {{projectName}}
    \n" + "Learn more about the command line tools.\n" + "
    \n" + "
    \n" + "\n" + "
    0\">\n" + "

    \n" + "\n" + "This resource has an autoscaler associated with it. It is recommended you delete the autoscaler with the resource it scales.\n" + "\n" + " 1\">\n" + "This resource has autoscalers associated with it. It is recommended you delete the autoscalers with the resource they scale.\n" + "\n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/modals/jenkinsfile-examples-modal.html', "
    \n" + "
    \n" + "

    Jenkinsfile Examples

    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/link-service.html', "
    \n" + "
    \n" + "

    Group Service to {{service.metadata.name}}

    \n" + "
    \n" + "Choose a service that {{service.metadata.name}} uses. This groups the services together in the overview.\n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{$select.selected.metadata.name}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/modals/process-template.html', "
    \n" + "
    \n" + "

    {{updateTemplate ? \"Update\" : \"Add\"}} Template

    \n" + "

    What would you like to do?

    \n" + "
    \n" + "\n" + "Create the objects defined in the template. You will have an opportunity to fill in template parameters.\n" + "
    \n" + "
    \n" + "\n" + "{{updateTemplate ? \"This will overwrite the current version of the template.\" : \"Save the template to the project. This will make the template available to anyone who can view the project.\"}}\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/monitoring.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Monitoring\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "{{$select.selected.label ? $select.selected.label : ($select.selected.kind | humanizeKind : true)}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    Pods

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    0\">The current filters are hiding all pods.
    \n" + "There are no pods in this project.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "created \n" + "
    \n" + "
    \n" + "\n" + "{{pod | podStatus | sentenceCase}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "{{pod.spec.containers[0].name}}\n" + "\n" + " 1\" ng-model=\"logOptions.pods[pod.metadata.name].container\" input-id=\"selectLogContainer\">\n" + "{{$select.selected.name}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Deployments

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    0 || (replicaSets | hashSize) > 0\">The current filters are hiding all deployments.
    \n" + "There are no deployments in this project.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "created \n" + "
    \n" + "
    \n" + "\n" + "{{replicationController | deploymentStatus | sentenceCase}}, {{replicationController.status.replicas}} replicas\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "created \n" + "
    \n" + "
    \n" + "{{replicaSet.status.replicas}} replicas\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Logs are not available for replica sets.\n" + "\n" + "To see application logs, view the logs for one of the replica set's\n" + "pods.\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Builds

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    0\">The current filters are hiding all builds.
    \n" + "There are no builds in this project.\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "created \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "{{build.spec.revision.git.message}}\n" + "{{build.spec.revision.git.commit | limitTo:7}}\n" + "\n" + "authored by {{build.spec.revision.git.author.name}}\n" + "\n" + "\n" + "\n" + "{{build.spec.source.git.uri}}\n" + "\n" + "\n" + "Source: {{build.spec.source.type}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "Log from {{build.status.startTimestamp | date : 'medium'}}\n" + "\n" + "to {{build.status.completionTimestamp | date : 'medium'}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/newfromtemplate.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "{{ emptyMessage }}\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Images

    \n" + "
      \n" + "
    • \n" + "\n" + "\n" + "{{ image.name }}\n" + "\n" + "\n" + "Image value set\n" + "from parameter 1\">s\n" + "\n" + "{{parameterDisplayNames[parameterName]}},\n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/other-resources.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Other Resources

    \n" + "
    \n" + "
    \n" + "\n" + "{{$select.selected.kind | humanizeKind : true}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameCreatedLabelsActions
    {{emptyMessage}}
    {{resource.metadata.name}}\n" + "none\n" + "\n" + "\n" + "\n" + "
      \n" + "
    • \n" + "Edit YAML\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/overview.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "

    Get started with your project.

    \n" + "

    \n" + "Use your source or an example repository to build an application image, or add components like databases and message queues.\n" + "

    \n" + "

    \n" + "\n" + "Add to Project\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "

    Welcome to project {{projectName}}.

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Loading...\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_dc.html', "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Deployment Config\n" + "{{deploymentConfig.metadata.name}}\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "{{deploymentConfig.spec.strategy.type}} \n" + "\n" + "View Log\n" + "|\n" + "\n" + "\n" + "Cancel\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Deployment is paused.\n" + "\n" + "Resume\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    No deployments.

    \n" + "
    \n" + "A new deployment will start automatically when\n" + "\n" + "an image is available for\n" + "\n" + "{{imageChangeTriggers[0].imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}}.\n" + "\n" + " 1\">\n" + "one of the images for this deployment config changes.\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "This deployment config is part of pipeline\n" + "{{pipeline.metadata.name}}.\n" + "

    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "No deployments have started for\n" + "{{deploymentConfig.metadata.name}}.\n" + "

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    1\" class=\"deployment-connector-arrow\">\n" + "
    \n" + "
    \n" + "\n" + "Deployment #{{orderedReplicationControllers[0] | annotation : 'deploymentVersion'}} {{orderedReplicationControllers[0] | deploymentStatus | lowercase}}\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{deploymentConfig.metadata.name}}\n" + "#{{orderedReplicationControllers[0] | annotation: 'deploymentVersion'}}\n" + "cancelled\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "{{deploymentConfig.metadata.name}}\n" + "#{{orderedReplicationControllers[0] | annotation: 'deploymentVersion'}}\n" + "failed\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_deployment.html', "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "Deployment\n" + "{{deploymentName}}\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "{{deployment.spec.strategy.type | sentenceCase}}\n" + "\n" + "
    \n" + "
    \n" + "\n" + "Deployment is paused.\n" + "\n" + "Resume\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_image-names.html', "{{podTemplate.spec.containers[0].image | imageStreamName}}\n" + "\n" + "{{id | stripSHAPrefix | limitTo: 7}},\n" + "\n" + " 1\"> and {{podTemplate.spec.containers.length - 1}} other image 2\">s" ); $templateCache.put('views/overview/_pod.html', "
    \n" + "\n" + "
    \n" + "
    \n" + "Pod\n" + "{{pod.metadata.name}}\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "View pod\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_service-group.html', "
    \n" + "
    \n" + "

    \n" + "\n" + "\n" + "{{appName | startCase}}\n" + "\n" + "{{service.metadata.name}}\n" + "\n" + "

    \n" + "

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "{{displayRoute | routeLabel}}\n" + "{{displayRoute | routeLabel}}\n" + "\n" + "\n" + "\n" + " 1\" class=\"other-routes-msg\">\n" + "and\n" + "{{(primaryServiceRoutes | hashSize) - 1}} other route 2\">s\n" + "\n" + "

    \n" + "\n" + "Create Route\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    No grouped services.

    \n" + "

    \n" + "No services are grouped with {{service.metadata.name}}.\n" + " 1 && ('services' | canI : 'update')\">Add a service to group them together.\n" + "

    \n" + "
    1 && ('services' | canI : 'update')\">\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_service-header.html', "
    \n" + "
    \n" + "\n" + "Service\n" + "{{service.metadata.name}}\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_service-linking-button.html', " ((childServices | hashSize) + 1)\" ng-click=\"linkService()\" role=\"button\" ng-attr-title=\"Group service to {{service.metadata.name}}\">Group service to {{service.metadata.name}}\n" + "Remove {{service.metadata.name}} from service group" ); $templateCache.put('views/overview/_service.html', "
    \n" + "
    \n" + "\n" + "
    \n" + "

    No deployments or pods.

    \n" + "

    \n" + "Service\n" + "{{service.metadata.name}}\n" + "does not route to any deployments or pods.\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    1\n" + " }\">\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    " ); $templateCache.put('views/overview/_set.html', "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "{{set.kind | humanizeKind : true}}\n" + "{{set.metadata.name}}\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "
    " ); $templateCache.put('views/overview/_traffic-percent.html', "
    \n" + "No Traffic\n" + "
    \n" + "
    \n" + "\n" + "Traffic {{(weightByService[service.metadata.name] / totalWeight) | percent}}\n" + "\n" + "
    \n" + "Traffic\n" + "\n" + "
    \n" + "
    \n" + "\n" + "{{(weightByService[service.metadata.name] / totalWeight) | percent}}\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/pipelines.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Pipelines\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Loading...\n" + "
    \n" + "
    \n" + "

    No pipelines.

    \n" + "
    \n" + "

    \n" + "No pipelines have been added to project {{projectName}}.\n" + "
    \n" + "Learn more about\n" + "Pipeline Builds\n" + "and the\n" + "OpenShift Pipeline Plugin.\n" + "

    \n" + "

    \n" + "\n" + "Create Sample Pipeline\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    \n" + "{{buildConfigName}}\n" + "created \n" + "

    \n" + "
    \n" + "Source Repository:\n" + "{{buildConfigs[buildConfigName].spec.source.git.uri}}\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    {{buildConfigName}}

    \n" + "\n" + "
    \n" + "\n" + "Warning:\n" + "Build config {{buildConfigName}} no longer exists.\n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "No pipeline builds have run for {{buildConfigName}}.\n" + "\n" + "View the Jenkinsfile to see what stages will run.\n" + "\n" + "\n" + "View the file {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} in the\n" + "source repository\n" + "source repository\n" + "to see what stages will run.\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "Average Duration: {{statsByConfig[buildConfigName].avgDuration | timeOnlyDuration}}\n" + "
    \n" + "

    \n" + "Recent Runs\n" + "\n" + "Average Duration: {{statsByConfig[buildConfigName].avgDuration | timeOnlyDuration}}\n" + "\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "View Pipeline Runs\n" + "\n" + "|\n" + "Edit Pipeline\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/pods.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Pods\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/project.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "

    Overview

    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "

    Get started with your project.

    \n" + "

    \n" + "Use your source or an example repository to build an application image, or add components like databases and message queues.\n" + "

    \n" + "

    \n" + "\n" + "Add to Project\n" + "\n" + "

    \n" + "
    \n" + "\n" + "
    \n" + "{{emptyMessage}}\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Service : {{serviceId}}\n" + "
    \n" + "\n" + "

    \n" + "\n" + "\n" + "{{displayRouteByService[serviceId] | routeLabel}}\n" + "\n" + "\n" + "\n" + "{{displayRouteByService[serviceId] | routeLabel}}\n" + "\n" + "\n" + "(and\n" + "one other route 1\">{{otherRoutes}} other routes)\n" + "\n" + "\n" + "\n" + "\n" + "
    0 && otherRoutes\">\n" + "\n" + "\n" + "This service has routes with warnings.\n" + "\n" + "
    \n" + "

    \n" + "\n" + "\n" + "

    \n" + "{{serviceId}}\n" + "

    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "{{portMapping.port}}/{{portMapping.protocol}} → {{portMapping.targetPort}}, \n" + "\n" + " 2\" ng-init=\"numRemaining = numPorts - 2\" class=\"more-ports\">\n" + "and {{numRemaining}} {{numRemaining == 1 ? \"other\" : \"others\"}}\n" + "\n" + "\n" + "
    \n" + "Create Route\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + "\n" + "
    \n" + " There are no pods or deployments for this service.\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/projects.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    Loading...

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Projects

    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Sort by\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "The current filter is hiding all projects.\n" + "Clear Filter\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "View and Edit Membership\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "Edit Display Name and Description\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "\n" + "\n" + "

    \n" + "\n" + "\n" + "created\n" + "by \n" + "\n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Welcome to OpenShift.

    \n" + "

    \n" + "OpenShift helps you quickly develop, host, and scale applications.
    \n" + "Create a project for your application.\n" + "

    \n" + "New Project\n" + "

    To learn more, visit the OpenShift documentation.

    \n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/quota.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Cluster Quota\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    {{quotaHelp}}
    \n" + "

    Loading...There are no resource quotas set on this project.

    \n" + "
    \n" + "
    \n" + "

    1\">{{quota.metadata.name}}

    \n" + "
    Limits resource usage across a set of projects.
    \n" + "
    \n" + "
    Scopes:
    \n" + "
    \n" + "
    \n" + "{{scope | startCase}}\n" + "— {{scope | scopeDetails}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Limit

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Limit

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "= (quota.status.total.hard[resourceType] | usageValue)\n" + " }\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Resource typeUsed (this project)Used (all projects)Max
    \n" + "\n" + "Status has not been reported on this quota usage record. Any resources limited by this quota record can not be allocated.\n" + "
    \n" + "{{resourceType | humanizeQuotaResource : true}}\n" + "= (quota.status.total.hard[resourceType] | usageValue)\" data-toggle=\"tooltip\" title=\"Quota limit reached\" class=\"pficon pficon-warning-triangle-o\" style=\"cursor: help; vertical-align: middle\">\n" + "\n" + "\n" + "{{namespaceUsageByClusterQuota[quota.metadata.name].used[resourceType] | usageWithUnits : resourceType}}\n" + "\n" + "\n" + "{{quota.status.total.used[resourceType] | usageWithUnits : resourceType}}\n" + "\n" + "{{specMax | usageWithUnits : resourceType}}\n" + "{{quota.status.total.hard[resourceType] | usageWithUnits : resourceType}}\n" + "
    \n" + "
    \n" + "
    \n" + "

    Project Quota

    \n" + "
    \n" + "

    1\">{{quota.metadata.name}}

    \n" + "
    {{quotaHelp}}
    \n" + "
    \n" + "
    Scopes:
    \n" + "
    \n" + "
    \n" + "{{scope | startCase}}\n" + "— {{scope | scopeDetails}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Limit

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Limit

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "= (quota.status.hard[resourceType] | usageValue)\n" + " }\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Resource typeUsedMax
    \n" + "\n" + "Status has not been reported on this quota usage record. Any resources limited by this quota record can not be allocated.\n" + "
    \n" + "{{resourceType | humanizeQuotaResource : true}}\n" + "= (quota.status.hard[resourceType] | usageValue)\" data-toggle=\"tooltip\" title=\"Quota limit reached\" class=\"pficon pficon-warning-triangle-o\" style=\"cursor: help; vertical-align: middle\">\n" + "\n" + "\n" + "{{quota.status.used[resourceType] | usageWithUnits : resourceType}}\n" + "\n" + "{{specMax | usageWithUnits : resourceType}}\n" + "{{quota.status.hard[resourceType] | usageWithUnits : resourceType}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Limit Range

    \n" + "
    \n" + "
    {{limitRangeHelp}}
    \n" + "

    {{emptyMessageLimitRanges}}

    \n" + "
    \n" + "
    \n" + "

    1\">{{limitRangeName}}

    \n" + "
    {{limitRangeHelp}}
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Resource type\n" + "\n" + "Min\n" + "\n" + "\n" + "\n" + "\n" + "Max\n" + "\n" + "\n" + "\n" + "Default\n" + "\n" + "Request\n" + "\n" + "\n" + "\n" + "Default\n" + "\n" + "Limit\n" + "\n" + "\n" + "\n" + "Max Limit/Request\n" + "\n" + "Ratio\n" + "\n" + "\n" + "
    {{limit.type}} {{type | computeResourceLabel : true}}{{(typeLimits.min | usageWithUnits : type) || \"—\"}}{{(typeLimits.max | usageWithUnits : type) || \"—\"}}{{(typeLimits.defaultRequest | usageWithUnits : type) || \"—\"}}{{(typeLimits[\"default\"] | usageWithUnits : type) || \"—\"}}{{typeLimits.maxLimitRequestRatio || \"—\"}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/secrets.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Create Secret\n" + "
    \n" + "

    \n" + "Secrets\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    Loading...
    \n" + "
    \n" + "
    \n" + "

    Source Secrets

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameTypeCreated
    No secrets
    \n" + "{{secret.metadata.name}}\n" + "\n" + "{{secret.type}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Image Secrets

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameTypeCreated
    \n" + "{{secret.metadata.name}}\n" + "\n" + "{{secret.type}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "

    Other Secrets

    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameTypeCreated
    \n" + "{{secret.metadata.name}}\n" + "\n" + "{{secret.type}}\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/services.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Services\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameCluster IPExternal IPPortsSelectorAge
    {{emptyMessage}}
    {{service.metadata.name}}{{service.spec.clusterIP}}\n" + "none\n" + "{{ingress.ip}},\n" + ", {{service.status.loadBalancer.ingress[4].ip}} 5\">, and {{service.status.loadBalancer.ingress.length - 4}} others\n" + "\n" + "none\n" + "{{portMapping.port}}/{{portMapping.protocol}},\n" + ", {{service.spec.ports[4].port}}/{{service.spec.ports[4].protocol}} 5\">, and {{service.spec.ports.length - 4}} others\n" + "\n" + "none\n" + "{{selectorLabel}}={{selectorValue}}, \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/set-limits.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "\n" + "
    Loading...
    \n" + "
    \n" + "

    Resource Limits: {{name}}

    \n" + "
    \n" + "Resource limits control how much CPU and memory a container will consume on a node.\n" + "
    \n" + "Learn More \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "Changes will only apply to new pods.\n" + "
    \n" + "
    \n" + "
    \n" + "

    1\">Container {{container.name}}

    \n" + "\n" + "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "{{problem}}\n" + "
    \n" + "
    \n" + "{{problem}}\n" + "
    \n" + "
    \n" + "\n" + "Cancel\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/settings.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "

    \n" + "Project Settings\n" + "
    \n" + "\n" + "Actions\n" + "
      \n" + "
    • \n" + "Edit\n" + "
    • \n" + "
    • \n" + "\n" + "\n" + "
    • \n" + "
    \n" + "
    \n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Quota\n" + "

    \n" + "
    {{quotaHelp}}
    \n" + "

    Loading...There are no resource quotas set on this project.

    \n" + "
    \n" + "
    \n" + "

    \n" + "Cluster Quota 1\">{{quota.metadata.name}}\n" + "

    \n" + "
    Limits resource usage across a set of projects.
    \n" + "
    \n" + "
    Scopes:
    \n" + "
    \n" + "
    \n" + "{{scope | startCase}}\n" + "— {{scope | scopeDetails}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Limit

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Limit

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "= (quota.status.total.hard[resourceType] | usageValue)\n" + " }\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Resource typeUsed (this project)Used (all projects)Max
    \n" + "\n" + "Status has not been reported on this quota usage record. Any resources limited by this quota record can not be allocated.\n" + "
    \n" + "{{resourceType | humanizeQuotaResource : true}}\n" + "= (quota.status.total.hard[resourceType] | usageValue)\" data-toggle=\"tooltip\" title=\"Quota limit reached\" class=\"pficon pficon-warning-triangle-o\" style=\"cursor: help; vertical-align: middle\">\n" + "\n" + "\n" + "{{namespaceUsageByClusterQuota[quota.metadata.name].used[resourceType] | usageWithUnits : resourceType}}\n" + "\n" + "\n" + "{{quota.status.total.used[resourceType] | usageWithUnits : resourceType}}\n" + "\n" + "{{specMax | usageWithUnits : resourceType}}\n" + "{{quota.status.total.hard[resourceType] | usageWithUnits : resourceType}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Project Quota 1\">{{quota.metadata.name}}\n" + "

    \n" + "
    {{quotaHelp}}
    \n" + "
    \n" + "
    Scopes:
    \n" + "
    \n" + "
    \n" + "{{scope | startCase}}\n" + "— {{scope | scopeDetails}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Request

    \n" + "\n" + "
    \n" + "
    \n" + "

    CPU Limit

    \n" + "\n" + "
    \n" + "
    \n" + "

    Memory Limit

    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "= (quota.status.hard[resourceType] | usageValue)\n" + " }\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Resource typeUsedMax
    \n" + "\n" + "Status has not been reported on this quota usage record. Any resources limited by this quota record can not be allocated.\n" + "
    \n" + "{{resourceType | humanizeQuotaResource : true}}\n" + "= (quota.status.hard[resourceType] | usageValue)\" data-toggle=\"tooltip\" title=\"Quota limit reached\" class=\"pficon pficon-warning-triangle-o\" style=\"cursor: help; vertical-align: middle\">\n" + "\n" + "\n" + "{{quota.status.used[resourceType] | usageWithUnits : resourceType}}\n" + "\n" + "{{specMax | usageWithUnits : resourceType}}\n" + "{{quota.status.hard[resourceType] | usageWithUnits : resourceType}}\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Limit Range

    \n" + "
    {{limitRangeHelp}}
    \n" + "

    {{emptyMessageLimitRanges}}

    \n" + "
    \n" + "
    \n" + "

    \n" + "Limit Range 1\">{{limitRangeName}}\n" + "

    \n" + "
    {{limitRangeHelp}}
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    Resource type\n" + "\n" + "Min\n" + "\n" + "\n" + "\n" + "\n" + "Max\n" + "\n" + "\n" + "\n" + "Default\n" + "\n" + "Request\n" + "\n" + "\n" + "\n" + "Default\n" + "\n" + "Limit\n" + "\n" + "\n" + "\n" + "Max Limit/Request\n" + "\n" + "Ratio\n" + "\n" + "\n" + "
    {{limit.type}} {{type | computeResourceLabel : true}}{{(typeLimits.min | usageWithUnits : type) || \"—\"}}{{(typeLimits.max | usageWithUnits : type) || \"—\"}}{{(typeLimits.defaultRequest | usageWithUnits : type) || \"—\"}}{{(typeLimits[\"default\"] | usageWithUnits : type) || \"—\"}}{{typeLimits.maxLimitRequestRatio || \"—\"}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/storage.html', "\n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    \n" + "Storage\n" + "\n" + "\n" + "Learn More \n" + "\n" + "\n" + "

    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "Create Storage\n" + "
    \n" + "

    Persistent Volume Claims

    \n" + "
    \n" + "Create Storage\n" + "
    \n" + "
    \n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " 0\">\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
    NameStatusCapacityAccess ModesAge
    {{emptyMessage}}
    {{pvc.metadata.name}}\n" + "\n" + "{{pvc.status.phase}}\n" + "to volume {{pvc.spec.volumeName}}\n" + "\n" + "\n" + "{{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}}\n" + "unknown\n" + "\n" + "\n" + "-\n" + "\n" + "{{pvc.spec.accessModes | accessModes:'long' | join}}
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/util/error.html', "\n" + "
    \n" + "
    \n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Error

    \n" + "

    {{errorMessage}}

    \n" + "
    {{errorDetails}}
    \n" + "
    \n" + "{{link.label}}\n" + "|\n" + "
    \n" + "
    \n" + "
    Return to the console.
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/util/logout.html', "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Log out

    \n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); $templateCache.put('views/util/oauth.html', "\n" + "
    \n" + "
    \n" + "
    \n" + "
    \n" + "

    Logging in…

    \n" + "

    Please wait while you are logged in…

    \n" + "
    \n" + "
    \n" + "

    Confirm Login

    \n" + "

    You are being logged in as {{confirmUser.metadata.name}}.

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "

    Confirm User Change

    \n" + "

    You are about to change users from {{overriddenUser.metadata.name}} to {{confirmUser.metadata.name}}.

    \n" + "

    If this is unexpected, click Cancel. This could be an attempt to trick you into acting as another user.

    \n" + "\n" + "\n" + "
    \n" + "
    \n" + "
    \n" + "
    " ); }]); `) func scriptsTemplatesJsBytes() ([]byte, error) { return _scriptsTemplatesJs, nil } func scriptsTemplatesJs() (*asset, error) { bytes, err := scriptsTemplatesJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "scripts/templates.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _scriptsVendorJs = []byte(`function aa(a) { var b = a.cloneNode; delete a.cloneNode, a.cloneNode = function(a) { return a === g && (a = j), b.call(this, a); }; } function ba(a) { (a = a.__proto__ || a.constructor.prototype) && a !== Array.prototype && ca.forEach(function(b) { a[b] || (a[b] = Array.prototype[b]); }); } function v(a, b, c) { return da.call(a, b, q.call(arguments, 2)); } function w(a, b) { for (var c = 1; c < arguments.length; c++) { var d, e = arguments[c]; for (d in e) u(e, d) && !u(a, d) && (a[d] = e[d]); } return a; } function x(a, b) { if (a == k && !b) throw new TypeError(); return ha && "string" == typeof a && a ? r.call(a, "") :Object(a); } function ja(a) { var b = Object.create(DOMException.prototype); throw b.code = DOMException[a], b.message = a + ": DOM Exception " + b.code, b; } function ka() { return l; } function la(a) { return a; } function Ja(a) { try { return Object.defineProperty(a, "sentinel", {}), "sentinel" in a; } catch (b) {} } function Ka(a) { try { return a.sentinel2 = 0, 0 === Object.getOwnPropertyDescriptor(a, "sentinel2").value; } catch (b) {} } function mergeDeep(a) { "use strict"; return angular.forEach(arguments, function(b) { b !== a && angular.forEach(b, function(b, c) { a[c] && a[c].constructor && a[c].constructor === Object ? mergeDeep(a[c], b) :a[c] = b; }); }), a; } function LabelSelector(a, b) { this._conjuncts = {}, this._emptySelectsAll = !!b, this._OPERATOR_MAP = { In:"in", NotIn:"not in", Exists:"exists", DoesNotExist:"does not exist" }, this._REVERSE_OPERATOR_MAP = { "in":"In", "not in":"NotIn", exists:"Exists", "does not exist":"DoesNotExist" }, a && (a.matchLabels || a.matchExpressions ? (angular.forEach(a.matchLabels, function(a, b) { this.addConjunct(b, "in", [ a ]); }, this), angular.forEach(a.matchExpressions, function(a) { this.addConjunct(a.key, this._OPERATOR_MAP[a.operator], a.values); }, this)) :angular.forEach(a, function(a, b) { a || "" === a ? this.addConjunct(b, "in", [ a ]) :this.addConjunct(b, "exists", []); }, this)); } var g = void 0, j = !0, k = null, l = !1, n = window, o, p = Object.prototype, da = Function.prototype.apply, q = Array.prototype.slice, r = String.prototype.split, ea = Array.prototype.splice, s, fa, ga, t = Function.prototype.bind || function(a, b) { var c = this, d = q.call(arguments, 1); return function() { return da.call(c, a, d.concat(q.call(arguments))); }; }, u = t.call(Function.prototype.call, p.hasOwnProperty), ha = "a" != Object("a")[0] || !(0 in Object("a")), ia = p.toString, ca = "every filter forEach indexOf join lastIndexOf map reduce reduceRight reverse slice some toString".split(" "), y = n.Element && n.Element.prototype || {}, z = t.call(document.__orig__createElement__ || document.createElement, document), A = z("p"), B, ma = /\\s+$/g, na = /\\s+/g, C = 1, D, oa = /^(\w+)?((?:\.(?:[\w\-]+))+)?$|^#([\w\-]+$)/, pa = /\s*([,>+~ ])\s*/g, qa, E, F, G, I, J, K, ra, sa, ta, ua, L, va, M, N = "\t\n\x0B\f\r   ᠎              \u2028\u2029\ufeff", wa, xa, ya, za, O, Q, Aa, Ba, R, S = n.Date, T, Ca, U, V, W, Da, Ga, X, Y; for (W = {}, W.names = (W.agent = navigator.userAgent.toLowerCase()).match(/(mozilla|compatible|chrome|webkit|safari|opera|msie|iphone|ipod|ipad)/gi), D = W.names && W.names.length || 0; 0 < D--; ) W[W.names[D]] = j; W.mozilla = W.mozilla && !W.compatible && !W.webkit, W.safari = W.safari && !W.chrome, W.msie = W.msie && !W.opera, o = W.msie || g, n.browser = W, n.HTMLDocument || (n.HTMLDocument = n.Document), n.Document || (n.Document = n.HTMLDocument), Object.append = w, Object.extend || (Object.extend = function(a, b) { for (var c = 1; c < arguments.length; c++) { var d, e = arguments[c]; for (d in e) u(e, d) && (a[d] = e[d]); } return a; }), Object.inherit = function(a, b) { (a.prototype = Object.create(a.superclass = b.prototype)).constructor = a; }, Function.prototype.bind || (Function.prototype.bind = function(a, b) { function c() { return da.call(d, this instanceof c ? this :a, e.concat(q.call(arguments))); } if ("function" != typeof this && (!o || 0 !== M.call(this + "").indexOf("function"))) throw new TypeError("Function.prototype.bind called on incompatible " + this); var d = this, e = q.call(arguments, 1); return d.prototype && (c.prototype = Object.create(d.prototype)), c; }); var $ = "toString toLocaleString valueOf hasOwnProperty isPrototypeOf propertyIsEnumerable constructor".split(" "), Ha = !{ toString:k }.propertyIsEnumerable($[0]), Ia = $.length; if (w(Object, { keys:function(a) { if ("object" != typeof a && "function" != typeof a || a === k) throw new TypeError("Object.keys called on a non-object"); var b, c = []; for (b in a) u(a, b) && c.push(b); if (Ha) for (b = 0; b < Ia; b++) u(a, $[b]) && c.push($[b]); return c; }, getOwnPropertyNames:function(a) { return Object.keys(a); }, seal:la, freeze:la, preventExtensions:la, isSealed:ka, isFrozen:ka, isExtensible:function(a) { if (Object(a) !== a) throw new TypeError(); for (var b = ""; u(a, b); ) b += "?"; a[b] = j; var c = u(a, b); return delete a[b], c; }, getPrototypeOf:function(a) { return a.__proto__ || (a.constructor ? a.constructor.prototype :p); }, create:function(a, b) { var c; if (a === k) c = { __proto__:k }; else { if ("object" != typeof a) throw new TypeError("typeof prototype[" + typeof a + "] != 'object'"); c = function() {}, c.prototype = a, c = new c(), c.__proto__ = a; } return b && Object.defineProperties(c, b), c; }, is:function(a, b) { return a === b ? 0 === a ? 1 / a === 1 / b :j :a !== a && b !== b; }, isnt:function(a, b) { return !Object.is(a, b); } }), !Object.defineProperty || (ya = Ja({}), za = Ja(A), ya && za) || (O = Object.defineProperty, Q = Object.defineProperties), Object.defineProperty && !O || (Object.defineProperty = function(a, b, c) { if ("object" != typeof a && "function" != typeof a || a === k) throw new TypeError("Object.defineProperty called on non-object: " + a); if ("object" != typeof c && "function" != typeof c || c === k) throw new TypeError("Property description must be an object: " + c); if (O) try { return O.call(Object, a, b, c); } catch (d) { if (d.number === -2146823252) { c.enumerable = l; try { return O.call(Object, a, b, c); } catch (e) {} } } if (c.value !== g) if (a.__defineGetter__ && (a.__lookupGetter__(b) || a.__lookupSetter__(b))) { var f = a.__proto__; a.__proto__ = p, delete a[b], a[b] = c.value, a.__proto__ = f; } else a[b] = c.value; else if (a.__defineGetter__) c.get !== g && a.__defineGetter__(b, c.get), c.set !== g && a.__defineSetter__(b, c.set); else { if (!Object.defineProperty.ielt8) throw new TypeError("getters & setters not supported"); c.get !== g && (a["get" + b] = c.get), c.set !== g && (a["set" + b] = c.set); } return a; }), y.ie && 8 > o && (y.ielt8 = Object.defineProperty.ielt8 = j), Object.defineProperties && !Q || (Object.defineProperties = function(a, b) { if (Q) try { return Q.call(Object, a, b); } catch (c) {} for (var d in b) u(b, d) && Object.defineProperty(a, d, b[d]); return a; }), !Object.getOwnPropertyDescriptor || (Aa = Ka({}), Ba = Ka(A), Ba && Aa) || (R = Object.getOwnPropertyDescriptor), Object.getOwnPropertyDescriptor && !R || (Object.getOwnPropertyDescriptor = function(a, b) { if ("object" != typeof a && "function" != typeof a || a === k) throw new TypeError("Object.getOwnPropertyDescriptor called on a non-object: " + a); if (R) try { return R.call(Object, a, b); } catch (c) {} if (u(a, b)) { var d, e, f = { enumerable:j, configurable:j }; if (a.__defineGetter__) { var g = a.__proto__; a.__proto__ = p, d = a.__lookupGetter__(b), e = a.__lookupSetter__(b), a.__proto__ = g; } else Object.defineProperty.ielt8 && (d = a["get" + b], e = a["set" + b]); return d || e ? (d && (f.get = d), e && (f.set = e), f) :(f.value = a[b], f); } }), 2 != [ 1, 2 ].splice(0).length && (Array.prototype.splice = function(a, b) { return a === g && b === g ? [] :ea.apply(this, [ a === g ? 0 :a, b === g ? this.length - a :b ].concat(q.call(arguments, 2))); }), ga = function(a) { if (a instanceof Array || Array.isArray(a)) return a; if (a.k) return a.k(); var b, a = x(a, j), c = a.length >>> 0; try { b = q.call(a); } catch (d) {} if (b && b.length === c) return b; b = []; for (var e = 0; e < c; e++) e in a && (b[e] = a[e]); return b; }, w(Array, { isArray:function(a) { return "[object Array]" == ia.call(a); }, from:ga, of:function(a) { return q.call(arguments); } }), w(Array.prototype, { reduce:function(a, b) { var c = x(this), d = c.length >>> 0, e = 0; if (0 === d && arguments.length <= 1) throw new TypeError("Array length is 0 and no second argument"); for (b === g && (++e, b = c[0]); e < d; ++e) e in c && (b = v(a, g, b, c[e], e, c)); return b; }, reduceRight:function(a, b) { var c = x(this), d = c.length >>> 0; if (0 === d && arguments.length <= 1) throw new TypeError("Array length is 0 and no second argument"); for (--d, b === g && (--d, b = c[d + 1]); d >= 0; --d) d in c && (b = v(a, g, b, c[d], d, c)); return b; }, forEach:function(a, b) { for (var c = x(this), d = c.length >>> 0, e = -1; ++e < d; ) e in c && v(a, b, c[e], e, c); }, indexOf:function(a, b) { var c = x(this), d = c.length >>> 0; if ((b = ~~b) > d) return -1; for (b = (d + b) % d; b < d && (!(b in c) || c[b] !== a); b++) ; return b ^ d ? b :-1; }, lastIndexOf:function(a, b) { var c, d = x(this), e = d.length >>> 0; if (!e) return -1; for (c = e - 1, b !== g && (c = Math.min(c, Number.toInteger(b))), c = c >= 0 ? c :e - Math.abs(c); c >= 0; c--) if (c in d && d[c] === a) return c; return -1; }, every:function(a, b, c) { c === g && (c = j); var d = c; return L(this, function(e, f) { d == c && (d = !!v(a, b, e, f, this)); }, this), d; }, some:function(a, b) { return va.call(this, a, b, l); }, filter:function(a, b) { for (var c, d = x(this), e = d.length >>> 0, f = [], g = 0; g < e; g++) g in d && (c = d[g], v(a, b, c, g, d) && f.push(c)); return f; }, map:function(a, b) { for (var c = x(this), d = c.length >>> 0, e = [], f = 0; f < d; f++) f in c && (e[f] = v(a, b, c[f], f, this)); return e; }, contains:function(a) { return !!~this.indexOf(a); } }), !Array.prototype.unique) { var La = function(a, b, c) { return c.indexOf(a, b + 1) < 0; }; Array.prototype.unique = function() { return this.filter(La); }; } L = t.call(Function.prototype.call, Array.prototype.forEach), fa = Array.prototype.map, va = Array.prototype.every, String.random || (String.random = function(a) { return !a || a < 0 ? "" :Array(++a).join(0).replace(/./g, function() { return (0 | 32 * Math.random()).toString(32); }); }), String.prototype.trim && !N.trim() || (N = "[" + N + "]", wa = RegExp("^" + N + N + "*"), xa = RegExp(N + N + "*$"), String.prototype.trim = function() { return String(this).replace(wa, "").replace(xa, ""); }), M = String.prototype.trim, "0".split(g, 0).length && (String.prototype.split = function(a, b) { return a === g && 0 === b ? [] :r.call(this, a, b); }), s = function(a, b) { return !!~this.indexOf(a, b); }, w(String.prototype, { repeat:function(a) { return Array(++a).join(this + ""); }, startsWith:function(a, b) { return this.lastIndexOf(a, b) === (b || 0); }, endsWith:function(a, b) { return a += "", this.substr(-a.length - (b || 0), b) == a; }, contains:s, toArray:function() { return r.call(this, ""); }, reverse:function() { return Array.prototype.reverse.call(r.call(this + "", "")).join(""); } }), w(Number, { isFinite:function(a) { return "number" == typeof a && n.i(a); }, isInteger:function(a) { return Number.isFinite(a) && a >= -9007199254740992 && a <= 9007199254740992 && Math.floor(a) === a; }, isNaN:function(a) { return Object.is(a, NaN); }, toInteger:function(a) { return a = +a, Number.isNaN(a) ? 0 :0 !== a && n.i(a) ? (a < 0 ? -1 :1) * Math.floor(Math.abs(a)) :a; } }), E = function(a, b) { var c = document.createEvent("Events"), b = b || {}; return c.initEvent(a, b.bubbles || l, b.cancelable || l), "isTrusted" in c || (c.j = l), c; }; try { G = Event.prototype, new Event("click"); } catch (Ma) { n.Event = E, G && (E.prototype = G); } F = function(a, b) { var c, d; try { c = document.createEvent("CustomEvent"); } catch (e) { c = document.createEvent("Event"); } return b = b || {}, d = b.detail !== g ? b.detail :k, (c.initCustomEvent || (c.detail = d, c.initEvent)).call(c, a, b.bubbles || l, b.cancelable || l, d), "isTrusted" in c || (c.j = l), c; }; try { I = (n.CustomEvent || Event).prototype, new CustomEvent("magic"); } catch (Na) { n.CustomEvent = F, (I || G) && (F.prototype = I || G); } if (G.stopImmediatePropagation || (J = function(a) { var b = this.f, c = this.g; if ("function" != typeof b) { if (!("handleEvent" in b)) return; c = b, b = b.handleEvent; } return a.__stopNow ? void a.stopPropagation() :b.apply(c, arguments); }, G.stopImmediatePropagation = function() { this.__stopNow = j; }), "addEventListener" in A && !A.addEventListener.__shim__) { D = 0; try { B = function() { D++; }, A.addEventListener("click", B), A.addEventListener("click", B), A.click ? A.click() :A.dispatchEvent(new E("click")); } catch (Oa) {} finally { if (0 == D || 2 == D || J) { var Pa = 2 == D; L([ n.HTMLDocument && n.HTMLDocument.prototype || n.document, n.Window && n.Window.prototype || n, y ], function(a) { if (a) { var b = a.addEventListener, c = a.removeEventListener; b && (a.addEventListener = function(a, c, d) { var e, f, d = d || l; if (Pa || J) { if (f = "_e_8vj" + (d ? "-" :"") + (c.__UUID__ || (c.__UUID__ = ++C)) + a, (e = this._) || (e = this._ = {}), f in e) return; c = J ? e[f] = t.call(J, { f:c, g:this }) :e[f] = g; } return b.call(this, a, c, d); }, c && (a.removeEventListener = function(a, b, d) { var e, f, d = d || l; return (Pa || J) && (e = this._) && e[f = "_e_8vj" + (d ? "-" :"") + b.__UUID__ + a] && (b = e[f], delete e[f]), c.call(this, a, b, d); })); } }); } } } K = function(a, b, c) { this.e = a, this.a = b, this.c = c, this.length = 0, this.value = "", this.b("1"); }, ra = function(a, b) { var c = b || "", d = !!a.length; if (d) { for (;a.length > 0; ) delete a[--a.length]; a.value = ""; } c && ((c = M.call(c)) && r.call(c, na).forEach(sa, a), a.value = b), d && a.a && a.a.call(a.c, a.value); }, sa = function(a) { this[this.length++] = a; }, w(K.prototype, { b:function(a) { var b = this.e.call(this.c); b != this.value && ra(this, b), "" === a && ja("SYNTAX_ERR"), s.call(a + "", " ") && ja("INVALID_CHARACTER_ERR"); }, add:function(a) { var b = this.value; this.contains(a) || (this.value = this.value + ((b && !b.match(ma) ? " " :"") + a), this[this.length++] = a, this.a && this.a.call(this.c, this.value)); }, remove:function(a) { this.b(a); var b; for (this.value = this.value.replace(RegExp("((?: +|^)" + a + "(?: +|$))", "g"), function(a, b, c, d) { return c && a.length + c < d.length ? " " :""; }), b = r.call(this.value, " "), a = this.length - 1; a > 0; --a) (this[a] = b[a]) || (this.length--, delete this[a]); this.a && this.a.call(this.c, this.value); }, contains:function(a) { return this.b(a), s.call(" " + this.value + " ", " " + a + " "); }, item:function(a) { return this.b("1"), this[a] || k; }, toggle:function(a) { var b = thisObj.contains(a); return this[b ? "add" :"remove"](a), b; } }), K.prototype.toString = function() { return this.value || ""; }, ua = function(a) { this.className = a; }, ta = function() { return this.className; }, n.Utils || (n.Utils = {}), n.Utils.Dom || (n.Utils.Dom = {}), n.Utils.Dom.DOMStringCollection = K, G.AT_TARGET || (G.AT_TARGET = 2, G.BUBBLING_PHASE = 3, G.CAPTURING_PHASE = 1), Event.AT_TARGET || (Event.AT_TARGET = 2, Event.BUBBLING_PHASE = 3, Event.CAPTURING_PHASE = 1); try { n.getComputedStyle(A); } catch (Qa) { n.getComputedStyle = t(function(a, b) { return this.call(n, a, b || k); }, n.getComputedStyle); } if ("classList" in A || Object.defineProperty(y, "classList", { get:function() { if (this.tagName) { var a = this._ || (this._ = {}); return a._ccl_ || (a._ccl_ = new K(ta, ua, this)), a._ccl_; } } }), "parentElement" in A || Object.defineProperty(y, "parentElement", { get:function() { var a = this.parentNode; return a && 1 === a.nodeType ? a :k; } }), "contains" in A || (n.Node.prototype.contains = function(a) { return !!(16 & this.compareDocumentPosition(a)); }), "insertAdjacentHTML" in A || (n.HTMLElement.prototype.insertAdjacentHTML = function(a, b) { var c, d = this.ownerDocument.createElement("_"), e = { beforebegin:"before", afterbegin:"prepend", beforeend:"append", afterend:"after" }; d.innerHTML = b, (d = d.childNodes) && d.length && (c = this[e[a]]) && c.apply(this, d); }), document.importNode && !document.importNode.shim) try { document.importNode(A); } catch (Ra) { var Sa = document.importNode; delete document.importNode, document.importNode = function(a, b) { return b === g && (b = j), Sa.call(this, a, b); }; } try { A.cloneNode(); } catch (Ta) { [ Node.prototype, y, Document.prototype, DocumentFragment.prototype ].forEach(aa); } A.prepend || (B = function(a) { var b, c = k, d = 0, e = a.length, a = fa.call(a, function(a) { return "string" == typeof a ? document.createTextNode(a) :a; }); if (1 === e) c = a[0]; else for (c = document.createDocumentFragment(), d = 0, e = a.length; d < (b = a.length); ++d) d -= e - b, c.appendChild(a[d]); return c; }, y.after = function() { this.parentNode && this.parentNode.insertBefore(B(arguments), this.nextSibling); }, y.before = function() { this.parentNode && this.parentNode.insertBefore(B(arguments), this); }, y.append = function() { this.appendChild(B(arguments)); }, y.prepend = function() { this.insertBefore(B(arguments), this.firstChild); }, y.replace = function() { this.parentNode && this.parentNode.replaceChild(B(arguments), this); }, y.remove = function() { this.parentNode && this.parentNode.removeChild(this); }, "prepend" in document || (document.prepend = function() { y.prepend.apply(this.documentElement, arguments); }, document.append = function() { y.append.apply(this.documentElement, arguments); })), y.matchesSelector || (y.matchesSelector = y.webkitMatchesSelector || y.mozMatchesSelector || y.msMatchesSelector || y.oMatchesSelector || function(a, b) { if (!a) return l; if ("*" === a) return j; var c, d, e, f, h, i, k = 0; b ? "length" in b ? c = b[0] :(c = b, b = g) :c = this; do if (i = l, c === document.documentElement ? i = ":root" === a :c === document.body && (i = "BODY" === a.toUpperCase()), !i) { if (a = M.call(a.replace(pa, "$1")), f = a.match(oa)) switch (a.charAt(0)) { case "#": i = c.id === a.slice(1); break; default: if ((i = !(f[1] && "tagName" in c && c.tagName.toUpperCase() !== f[1].toUpperCase())) && f[2]) for (e = -1, h = f[2].slice(1).split("."), f = " " + c.className + " "; h[++e] && i; ) i = s.call(f, " " + h[e] + " "); } if (!/([,>+~ ])/.test(a) && (d = c.parentNode) && d.querySelector && (i = d.querySelector(a) === c), !i && (d = c.ownerDocument)) for (h = d.querySelectorAll(a), e = -1; !i && h[++e]; ) i = h[e] === c; } while (i && b && (c = b[++k])); return b && "length" in b ? i && b.length == k :i; }), document.documentElement.matchesSelector || (document.documentElement.matchesSelector = y.matchesSelector), "matches" in y || (y.matches = document.documentElement.matches = y.matchesSelector), "find" in document || (qa = /(\:scope)(?=[ >~+])/, document.find = DocumentFragment.prototype.find = function(a, b) { b && ("length" in b || (b = [ b ])) || (b = [ this ]); var c, d, e = 0, f = b.length; do d = b[e], a = a.replace(qa, 9 == d.nodeType ? ":root" :document_find_scopedreplacer = function() { return "#" + (d.id || (d.id = "find" + ++C)); }), c = d.querySelector(a); while (!c && ++e < f); return c || k; }, document.findAll = DocumentFragment.prototype.findAll = function(a, b) { b && ("length" in b || (b = [ b ])) || (b = [ this ]); var c, d, e, f, h, i, k = [], m = 0, n = b.length, o = {}; do for (c = b[m], a = a.replace(qa, 9 == c.nodeType ? ":root" :document_find_scopedreplacer = function() { return "#" + (c.id || (c.id = "find" + ++C)); }), d = c.querySelectorAll(a), f = 0, h = d.length; f < h; ++f) e = d[f], i = l, e = e.__UUID__ || (i = j, e.__UUID__ = ++C), !i && e in o || (o[e] = g, k.push(d[f])); while (++m < n); return k; }), "find" in y || (y.find = y.querySelector, y.findAll = y.querySelectorAll), "labels" in z("input") || Object.defineProperty(y, "labels", { enumerable:j, get:function() { if (s.call(" INPUT BUTTON KEYGEN METER OUTPUT PROGRESS TEXTAREA SELECT ", " " + this.nodeName.toUpperCase() + " ")) { for (var a = this, b = this.id ? ga(document.querySelectorAll("label[for='" + this.id + "']")) :[], c = b.length - 1; (a = a.parentNode) && (!a.h || a.h === this); ) if ("LABEL" === a.nodeName.toUpperCase()) { for (;b[c] && 2 & b[c].compareDocumentPosition(a); ) c--; ea.call(b, c + 1, 0, a); } return b; } } }), "control" in z("label") || (Da = function(a, b) { for (var c = 0, d = a.length; c < d; c++) { var e = a[c], f = b(e); if (f) return f; if (e.childNodes && e.childNodes.length > 0 && (f = Da(e.childNodes, b))) return f; } }, Object.defineProperty(n.HTMLLabelElement && n.HTMLLabelElement.prototype || y, "control", { enumerable:j, get:function() { return "LABEL" !== this.nodeName.toUpperCase() ? g :this.hasAttribute("for") ? document.getElementById(this.htmlFor) :Da(this.childNodes, function(a) { if (s.call(" INPUT BUTTON KEYGEN METER OUTPUT PROGRESS TEXTAREA SELECT ", " " + a.nodeName.toUpperCase() + " ")) return a; }) || k; } })), "reversed" in z("ol") || (Ga = function(a) { var b, c, d = a.getAttribute("reversed"), e = a._; e || (e = a._ = {}), "olreversed" in e && e.olreversed == (d !== k) || (b = a.children, c = a.getAttribute("start"), c !== k && (c = Number(c), isNaN(c) && (c = k)), d !== k ? (e.olreversed = j, c === k && (c = b.length), L(b, function(a) { a.value = c--; })) :(e.olreversed = l, b[0] && (b[0].value = c || 0), L(b, function(a) { a.removeAttribute("value"); }))); }, Object.defineProperty(n.HTMLOListElement && n.HTMLOListElement.prototype || y, "reversed", { get:function() { return "OL" !== (this.nodeName || "").toUpperCase() ? g :this.getAttribute("reversed") !== k; }, set:function(a) { if ("OL" === (this.nodeName || "").toUpperCase()) return this[(a ? "set" :"remove") + "Attribute"]("reversed", ""), Ga(this), a; } }), X = function() { document.removeEventListener("DOMContentLoaded", X, l), X = g, L(document.getElementsByTagName("ol"), Ga); }, "complete" == document.readyState ? X() :document.addEventListener("DOMContentLoaded", X, l)), document.getElementsByClassName && ba(document.getElementsByClassName("")), document.querySelectorAll && ba(document.querySelectorAll("#z")), Y = n.XHR = function(a, b) { a = w(a || {}, Y.d), Object.keys(Y.d).forEach(function(b) { "object" == typeof this[b] && w(a[b], this[b]); }, Y.d); var c = new XMLHttpRequest(), d = a.data || "", e = "post" == a.method.toLowerCase(), f = a.uri; "object" == typeof d && a == Y.d.headers["Content-Type"] && (d = Object.keys(d).map(function(a) { var b = this[a]; return "object" == typeof b ? Object.keys(b).map(function(b) { return a + "=" + this[b]; }, b).join("&") :a + "=" + b; }, d).join("&")), c.onreadystatechange = function() { 4 === this.readyState && b.call(this, k, this.response || this.responseText || this.responseXML); }, c.onerror = function(a) { b.call(this, a); }; try { c.open(a.method, f + (e ? "" :f.indexOf("?") ? "&" :"?" + d)), a.headers && Object.keys(a.headers).forEach(function(b) { c.setRequestHeader(b, a.headers[b]); }), c.send(e && d || k); } catch (g) { b.call(this, g); } return c; }, Y.d = { headers:{ "X-Requested-With":"HTTPRequest", "Content-Type":"application/x-www-form-urlencoded;charset=utf-8" } }, S.prototype.toISOString && !s.call(new S((-621987552e5)).toISOString(), "-000001") && "1969-12-31T23:59:59.999Z" === new S((-1)).toISOString() || (S.prototype.toISOString = function() { var a, b, c, d; if (!isFinite(this)) throw new RangeError("Date.prototype.toISOString called on non-finite value."); for (d = this.getUTCFullYear(), a = this.getUTCMonth(), d += ~~(a / 12), a = [ (a % 12 + 12) % 12 + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds() ], d = (d < 0 ? "-" :d > 9999 ? "+" :"") + ("00000" + Math.abs(d)).slice(0 <= d && d <= 9999 ? -4 :-6), b = a.length; b--; ) c = a[b], c < 10 && (a[b] = "0" + c); return d + "-" + a.slice(0, 2).join("-") + "T" + a.slice(2).join(":") + "." + ("000" + this.getUTCMilliseconds()).slice(-3) + "Z"; }), S.now || (S.now = function() { return new S().getTime(); }); var Ua; if (!(Ua = !S.prototype.toJSON)) { var Va; if (!(Va = s.call(new S((-621987552e5)).toJSON(), "-000001"))) { var Wa; a:{ try { Wa = S.prototype.toJSON.call({ toISOString:function() { return -1; } }); break a; } catch (Xa) {} Wa = g; } Va = ~Wa; } Ua = Va; } if (Ua && (S.prototype.toJSON = function() { return v(this.toISOString, this); }), !S.parse) { T = function(a, b, c, d, e, f, g) { var h = arguments.length; return this instanceof S ? (h = 1 == h && String(a) === a ? new S(T.parse(a)) :h >= 7 ? new S(a, b, c, d, e, f, g) :h >= 6 ? new S(a, b, c, d, e, f) :h >= 5 ? new S(a, b, c, d, e) :h >= 4 ? new S(a, b, c, d) :h >= 3 ? new S(a, b, c) :h >= 2 ? new S(a, b) :h >= 1 ? new S(a) :new S(), h.constructor = T, h) :S.apply(this, arguments); }, Ca = RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"), U = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 ], V = function(a) { return Math.ceil(a / 4) - Math.ceil(a / 100) + Math.ceil(a / 400); }; for (D in S) T[D] = S[D]; T.now = S.now, T.UTC = S.UTC, T.prototype = S.prototype, T.prototype.constructor = T, T.parse = function(a) { var b = Ca.exec(a); if (b) { var c = Number(b[1]), d = Number(b[2] || 1), e = Number(b[3] || 1), f = Number(b[4] || 0), g = Number(b[5] || 0), h = Number(b[6] || 0), i = Number(b[7] || 0), j = b[8] ? 0 :Number(new Date(1970, 0)), k = "-" === b[9] ? 1 :-1, l = Number(b[10] || 0), b = Number(b[11] || 0), m = V(c), n = V(c + 1); return f < (g > 0 || h > 0 || i > 0 ? 24 :25) && g < 60 && h < 60 && i < 1e3 && l < 24 && b < 60 && d > 0 && d < 13 && e > 0 && e < 1 + U[d] - U[d - 1] + (2 === d ? n - m :0) && (c = 365 * (c - 1970) + (d > 2 ? n :m) - V(1970) + U[d - 1] + e - 1, c = 1e3 * (60 * (60 * (24 * c + f + l * k) + g + b * k) + h) + i + j, -864e13 <= c && c <= 864e13) ? c :NaN; } return S.parse.apply(this, arguments); }, n.Date = T; } if ((D = n._) && D.ielt9shims && (D.ielt9shims.forEach(v), n._ = D.orig_), w = D = A = ca = z = E = F = G = I = y = T = ka = g, function(a, b) { "object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) :function(a) { if (!a.document) throw new Error("jQuery requires a window with a document"); return b(a); } :b(a); }("undefined" != typeof window ? window :this, function(a, b) { function c(a) { var b = "length" in a && a.length, c = _.type(a); return "function" !== c && !_.isWindow(a) && (!(1 !== a.nodeType || !b) || ("array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a)); } function d(a, b, c) { if (_.isFunction(b)) return _.grep(a, function(a, d) { return !!b.call(a, d, a) !== c; }); if (b.nodeType) return _.grep(a, function(a) { return a === b !== c; }); if ("string" == typeof b) { if (ha.test(b)) return _.filter(b, a, c); b = _.filter(b, a); } return _.grep(a, function(a) { return U.call(b, a) >= 0 !== c; }); } function e(a, b) { for (;(a = a[b]) && 1 !== a.nodeType; ) ; return a; } function f(a) { var b = oa[a] = {}; return _.each(a.match(na) || [], function(a, c) { b[c] = !0; }), b; } function g() { Z.removeEventListener("DOMContentLoaded", g, !1), a.removeEventListener("load", g, !1), _.ready(); } function h() { Object.defineProperty(this.cache = {}, 0, { get:function() { return {}; } }), this.expando = _.expando + h.uid++; } function i(a, b, c) { var d; if (void 0 === c && 1 === a.nodeType) if (d = "data-" + b.replace(ua, "-$1").toLowerCase(), c = a.getAttribute(d), "string" == typeof c) { try { c = "true" === c || "false" !== c && ("null" === c ? null :+c + "" === c ? +c :ta.test(c) ? _.parseJSON(c) :c); } catch (e) {} sa.set(a, b, c); } else c = void 0; return c; } function j() { return !0; } function k() { return !1; } function l() { try { return Z.activeElement; } catch (a) {} } function m(a, b) { return _.nodeName(a, "table") && _.nodeName(11 !== b.nodeType ? b :b.firstChild, "tr") ? a.getElementsByTagName("tbody")[0] || a.appendChild(a.ownerDocument.createElement("tbody")) :a; } function n(a) { return a.type = (null !== a.getAttribute("type")) + "/" + a.type, a; } function o(a) { var b = Ka.exec(a.type); return b ? a.type = b[1] :a.removeAttribute("type"), a; } function p(a, b) { for (var c = 0, d = a.length; c < d; c++) ra.set(a[c], "globalEval", !b || ra.get(b[c], "globalEval")); } function q(a, b) { var c, d, e, f, g, h, i, j; if (1 === b.nodeType) { if (ra.hasData(a) && (f = ra.access(a), g = ra.set(b, f), j = f.events)) { delete g.handle, g.events = {}; for (e in j) for (c = 0, d = j[e].length; c < d; c++) _.event.add(b, e, j[e][c]); } sa.hasData(a) && (h = sa.access(a), i = _.extend({}, h), sa.set(b, i)); } } function r(a, b) { var c = a.getElementsByTagName ? a.getElementsByTagName(b || "*") :a.querySelectorAll ? a.querySelectorAll(b || "*") :[]; return void 0 === b || b && _.nodeName(a, b) ? _.merge([ a ], c) :c; } function s(a, b) { var c = b.nodeName.toLowerCase(); "input" === c && ya.test(a.type) ? b.checked = a.checked :"input" !== c && "textarea" !== c || (b.defaultValue = a.defaultValue); } function t(b, c) { var d, e = _(c.createElement(b)).appendTo(c.body), f = a.getDefaultComputedStyle && (d = a.getDefaultComputedStyle(e[0])) ? d.display :_.css(e[0], "display"); return e.detach(), f; } function u(a) { var b = Z, c = Oa[a]; return c || (c = t(a, b), "none" !== c && c || (Na = (Na || _("