diff --git a/Makefile b/Makefile index 57088e0b84..d804a0c12a 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ IMAGE = $(REGISTRY)/$(IMGNAME) MULTI_ARCH_IMG = $(IMAGE)-$(ARCH) # Set default base image dynamically for each arch -BASEIMAGE?=quay.io/kubernetes-ingress-controller/nginx-$(ARCH):0.34 +BASEIMAGE?=quay.io/kubernetes-ingress-controller/nginx-$(ARCH):0.37 ifeq ($(ARCH),arm) QEMUARCH=arm diff --git a/cmd/nginx/flags.go b/cmd/nginx/flags.go index c732fe30ce..eb57e7bd29 100644 --- a/cmd/nginx/flags.go +++ b/cmd/nginx/flags.go @@ -131,6 +131,9 @@ func parseFlags() (bool, *controller.Configuration, error) { publishStatusAddress = flags.String("publish-status-address", "", `User customized address to be set in the status of ingress resources. The controller will set the endpoint records on the ingress using this address.`) + + dynamicConfigurationEnabled = flags.Bool("enable-dynamic-configuration", false, + `When enabled controller will try to avoid Nginx reloads as much as possible by using Lua. Disabled by default.`) ) flag.Set("logtostderr", "true") @@ -192,28 +195,29 @@ func parseFlags() (bool, *controller.Configuration, error) { } config := &controller.Configuration{ - APIServerHost: *apiserverHost, - KubeConfigFile: *kubeConfigFile, - UpdateStatus: *updateStatus, - ElectionID: *electionID, - EnableProfiling: *profiling, - EnableSSLPassthrough: *enableSSLPassthrough, - EnableSSLChainCompletion: *enableSSLChainCompletion, - ResyncPeriod: *resyncPeriod, - DefaultService: *defaultSvc, - Namespace: *watchNamespace, - ConfigMapName: *configMap, - TCPConfigMapName: *tcpConfigMapName, - UDPConfigMapName: *udpConfigMapName, - DefaultSSLCertificate: *defSSLCertificate, - DefaultHealthzURL: *defHealthzURL, - PublishService: *publishSvc, - PublishStatusAddress: *publishStatusAddress, - ForceNamespaceIsolation: *forceIsolation, - UpdateStatusOnShutdown: *updateStatusOnShutdown, - SortBackends: *sortBackends, - UseNodeInternalIP: *useNodeInternalIP, - SyncRateLimit: *syncRateLimit, + APIServerHost: *apiserverHost, + KubeConfigFile: *kubeConfigFile, + UpdateStatus: *updateStatus, + ElectionID: *electionID, + EnableProfiling: *profiling, + EnableSSLPassthrough: *enableSSLPassthrough, + EnableSSLChainCompletion: *enableSSLChainCompletion, + ResyncPeriod: *resyncPeriod, + DefaultService: *defaultSvc, + Namespace: *watchNamespace, + ConfigMapName: *configMap, + TCPConfigMapName: *tcpConfigMapName, + UDPConfigMapName: *udpConfigMapName, + DefaultSSLCertificate: *defSSLCertificate, + DefaultHealthzURL: *defHealthzURL, + PublishService: *publishSvc, + PublishStatusAddress: *publishStatusAddress, + ForceNamespaceIsolation: *forceIsolation, + UpdateStatusOnShutdown: *updateStatusOnShutdown, + SortBackends: *sortBackends, + UseNodeInternalIP: *useNodeInternalIP, + SyncRateLimit: *syncRateLimit, + DynamicConfigurationEnabled: *dynamicConfigurationEnabled, ListenPorts: &ngx_config.ListenPorts{ Default: *defServerPort, Health: *healthzPort, diff --git a/internal/file/bindata.go b/internal/file/bindata.go index d92b9dc873..0bd805aa1a 100644 --- a/internal/file/bindata.go +++ b/internal/file/bindata.go @@ -1,5 +1,8 @@ // Code generated by go-bindata. // sources: +// rootfs/etc/nginx/lua/balancer.lua +// rootfs/etc/nginx/lua/configuration.lua +// rootfs/etc/nginx/lua/util.lua // rootfs/etc/nginx/nginx.conf // rootfs/etc/nginx/template/nginx.tmpl // rootfs/ingress-controller/clean-nginx-conf.sh @@ -70,6 +73,66 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } +var _etcNginxLuaBalancerLua = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x56\xdd\x8e\xdb\x36\x13\xbd\xd7\x53\x0c\x74\x25\xe1\xd3\x0a\xd9\x0f\xbd\x5a\xd4\x05\xf2\xb3\x05\x82\x24\x76\xe1\xa4\x05\x82\x22\x20\xb8\xd4\x58\x66\x4c\x93\x2a\x49\xad\xed\x06\x79\xf7\x62\x28\x89\x92\xbc\x4a\x17\xbd\x59\xaf\xc8\xe1\x99\x99\x33\x67\x86\x54\x46\x70\x05\xba\x3e\xb3\x07\xae\xb8\x16\x68\x61\x05\x16\xff\x6a\xa5\xc5\x2c\xd5\xf5\xb9\x1c\xd6\xd3\x3c\xe9\x8c\xbf\x3a\xa3\xa7\x46\x82\x16\xe2\xae\x30\x7a\x27\xeb\xd6\x72\x2f\xaf\xcc\xa6\x1b\xd1\xbc\xf5\x52\x4d\xad\xe8\x3b\x6e\x2a\xdb\x0a\x2e\xf6\x38\x35\xb0\xe8\xfc\xa5\x1c\x76\xa2\x69\x58\x66\xca\x88\xc3\x82\xb1\x11\x87\x34\x4f\x92\x9b\x1b\x38\x22\x77\xad\xc5\x0a\xa4\x06\x87\xc2\xe8\xca\xd1\xf2\xce\x58\xe0\x1a\xd6\xb5\xd4\x67\x38\x19\x7b\x40\x0b\xde\x40\x23\xc5\x01\xda\x06\xfc\x1e\x41\xe3\x09\x94\x74\x1e\xcc\x0e\xda\xc6\x79\x8b\xfc\x08\x0d\xa2\x75\x40\x08\xd2\xc3\x49\x2a\x05\x9e\x1f\x10\x7e\xa6\x03\x15\x2a\x7e\x81\x56\x53\x82\xc2\x68\x6f\x8d\x52\x68\xe1\xb7\xcd\xc7\x4f\x58\x05\xc8\x07\x2e\x0e\xa8\x2b\x30\x0f\x5f\x51\x78\x72\x48\xab\x5d\x10\xa8\xab\xc6\x48\xed\x7f\x81\xff\xc1\xab\x97\xaf\xdf\xdd\xaf\xdf\x7c\x64\x1f\x3f\xaf\x5f\xb3\xb7\xeb\x4f\xf7\xdb\x3f\x5e\xbe\xef\x13\x5f\xde\x84\x15\xdc\x26\xc9\x76\xf3\xfb\xfa\x0d\xdb\x6e\x5e\xbd\x5d\xb3\xf7\x9b\xd7\xef\xd8\xbb\xfb\xcf\xb0\x82\xd4\x9a\x56\x57\xcc\x9a\x07\xa9\xd3\x64\x20\x70\x5c\x63\xce\x73\x4f\xa4\x53\xf9\xdd\x9e\x5b\xac\xca\x27\xdb\xc3\x39\xf6\x01\x56\xf0\xed\xfb\x12\x4c\xac\xc6\x50\x9a\x3b\x8d\xa7\x2c\xa5\xff\x5c\x5a\xc0\x37\x2f\x8f\x68\x5a\x0f\x2b\x78\x51\x00\x9e\x1b\xfa\xa6\x8f\xf2\xf6\x7b\x3e\xe0\xf5\x1c\xb9\x02\xd0\x92\x34\x87\xc2\x97\x04\x75\xfb\xe2\xff\x3f\xe5\x89\xdc\x81\x36\x3e\x5a\x12\x89\x3a\x01\xb0\xe8\x5b\xab\xe9\x98\xb1\x59\xba\xe3\x52\x11\xed\x06\x84\x45\xca\x8e\xa8\xee\xc4\x45\xc5\x1f\x0e\xdf\x41\x0a\x65\x09\x19\x39\x33\x16\xd2\x56\x1f\xb4\x39\xe9\x34\xcf\x13\xd4\xd5\x10\xd4\xae\xd5\x22\xc8\xbb\xef\x8d\x2c\x4f\x00\x66\xf1\x32\xcd\x8f\x03\x83\x8f\xdc\x96\x8d\x35\xe7\x0b\x1b\x74\x13\x76\xaf\x8f\xc0\x6a\x8c\xa2\x46\x9f\x4d\x91\x08\xff\xe6\x06\xd4\x03\xe3\xaa\x86\x9d\x44\x55\x41\x65\xd0\x85\xc4\xf1\x4c\xb2\xa4\x2c\xa4\xae\x2d\x3a\x57\xbe\xea\x11\x9d\xb7\xad\xe8\xb6\xb4\x39\x15\xe0\x4c\x0f\xd1\xc1\x05\xc1\x72\x75\xe2\x17\x07\x0f\x38\x2d\x5d\x8c\xad\xf7\x18\x43\x2b\xfb\x05\xe2\x66\xae\x22\x00\xb9\x8b\xe6\x2b\x48\x65\xc3\xf6\xdc\xed\xd3\xa1\x1c\xc1\xe3\xa7\xcd\x9b\x4d\x86\xea\x51\x6a\xdc\xa1\xae\x64\x0e\xf2\xd8\x28\x3c\xa2\xf6\x10\x18\x89\x65\x1b\xfc\x0d\x7d\xe0\xfe\x7c\xf1\xa5\xe4\x55\x45\xf9\x15\xcb\xbb\x8d\xb1\x3e\x01\x08\x75\x0a\xde\xb6\x14\xe0\xcd\xb6\x4f\xe8\x5a\x99\x77\xf4\x67\xc6\x32\x55\x7e\xa9\x65\xc6\xea\x4a\x5d\xe1\x99\x24\x7d\xdd\x0d\x8b\x15\x9b\x9c\x29\x62\x43\x93\x28\xf0\x1c\x8d\xc7\x14\x8a\xce\x32\xef\x98\xa4\xc2\x76\xde\x22\x7f\x83\xf3\xdb\xf0\x35\xc1\x7b\xca\x46\x30\xfd\xd2\x93\x01\x0b\xe1\xba\xab\x70\x27\xce\x9f\xf0\xd4\xea\xff\xc0\xd4\xa4\xf1\xfa\x68\xc6\xaa\xc5\x95\x50\xa9\xa5\x7e\x72\x17\x2d\x58\xef\x68\x70\x48\x31\xc5\xc6\x98\xc4\x5d\x76\x71\x47\xab\xae\xe6\x5c\x39\x43\x13\x07\x7d\xe8\x70\x8b\xae\x41\xe1\xe5\x23\x42\xbc\xdf\xba\xe9\xe6\xa4\x16\xe3\x08\xde\x73\x07\x62\xcf\x75\x8d\xcb\x7c\x55\xa8\xd0\xe3\xcc\x75\xf0\x48\xfd\xad\x4c\x9d\xd1\xef\xdb\xf5\xaf\x9b\x02\x52\xca\xc1\x1a\x2d\xff\xee\x6e\x40\x61\x48\xe1\x1e\x2b\x6a\xc3\x7e\xbc\xcc\x61\x9e\x23\xc2\x3d\x1d\x2f\x8e\x55\xdc\x73\x58\xcd\x6f\xdb\xb2\x46\xcf\x66\x16\xd9\x44\x4d\xf3\xa3\x51\x55\x5d\xb5\xc6\xbe\xe9\xfc\x98\x43\x41\x37\x5e\x44\x83\x15\x34\x82\x2b\x95\xd1\x5d\x5f\x56\x28\x4c\x35\x72\xdf\x41\x4e\x5c\x99\xc3\x88\x3f\x65\xe8\x7e\xbb\x2d\x00\x52\x61\x5a\x55\x05\xc3\x86\x5b\x87\xe3\xe4\x26\x98\x9e\x22\x6f\x9c\xb7\x52\xd7\xd9\x34\x8a\x3c\x5f\x0c\x99\xe6\x1b\x9b\xc5\x4b\xd7\x7b\xc3\xa5\x75\xf3\xe3\x50\x99\x00\xf0\xaf\x73\x77\x72\xa2\x1c\x3a\xf9\x7a\xba\xf7\x52\x81\x15\x78\xdb\x62\xd2\xb5\xe7\x2e\x22\xc6\xe4\x61\xe1\x04\xe5\x4d\xaf\x9c\xb2\x42\x6c\x18\xc9\x83\xdb\xa8\xac\x59\x16\xf9\xd0\xe8\xd7\x0e\x22\xda\xc4\xd1\xac\x75\x16\x41\xba\xbf\x01\x2e\xea\x8c\x7d\x28\xa5\x96\x9e\x75\x6f\x9e\x20\x17\x36\x5c\xb5\x54\x31\xba\x92\x6d\x89\x8f\x68\x2f\xd9\xf2\x4b\xa3\x98\x6b\xb5\x57\x01\x21\xfc\x58\x02\x69\xb8\x94\xe1\xb4\x47\x7a\x85\x79\x2f\x75\x1d\x9e\x59\xa3\xb3\x50\xd3\x19\xf0\xb5\x2e\xd0\xda\x20\x87\xc5\x9c\x82\x54\xf3\xae\x3f\xe3\xc3\xb6\x74\xe8\xd9\xd1\x58\x64\xde\x4a\x74\xd9\x6d\x3e\xea\x7d\x6f\x9c\x2f\x80\xe6\x52\x90\xc3\x70\xab\xcf\xfa\x21\xb2\x32\x47\x14\xad\xb5\xa8\x3d\xa3\xb7\x60\x36\xe2\xf4\x44\xfc\xa8\x15\xfa\x61\xd1\x1f\x0e\x0f\x49\x90\x0e\xc2\xdc\x32\x5d\xaa\x84\x45\xbf\xe9\x5d\xf8\x1c\x40\x51\x39\x7c\x86\x56\xa9\x30\xf2\x3a\x78\x98\xbd\x59\xc1\x9b\x67\xf9\xec\xc7\x38\xfb\x90\xfc\x13\x00\x00\xff\xff\x07\x54\x62\xed\x24\x0c\x00\x00") + +func etcNginxLuaBalancerLuaBytes() ([]byte, error) { + return bindataRead( + _etcNginxLuaBalancerLua, + "etc/nginx/lua/balancer.lua", + ) +} + +func etcNginxLuaBalancerLua() (*asset, error) { + bytes, err := etcNginxLuaBalancerLuaBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "etc/nginx/lua/balancer.lua", size: 3108, mode: os.FileMode(420), modTime: time.Unix(1521218836, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _etcNginxLuaConfigurationLua = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x53\xc1\x8e\xdb\x46\x0c\xbd\xeb\x2b\x5e\x7d\x89\x17\xb0\x65\xb7\xc8\x29\x80\x2f\x45\x7b\x29\xb0\xd9\x22\xc9\x5d\xa0\x25\x4a\x9a\xee\x78\xa8\xe5\x70\xbc\x11\x8a\xf6\xdb\x8b\x19\x79\xdd\x38\xbb\x39\x19\x1e\x92\xef\x91\xef\x3d\x6d\xb7\x78\xe4\xf9\x5d\x04\x29\x83\xfc\x33\xcd\x11\x83\xb8\x30\xc0\x04\x47\x46\x18\xbe\xd6\x67\xd2\x7a\x52\xf9\x3a\x37\x69\x8a\xa6\x4c\xa7\x26\xd0\x89\x37\x20\xa4\xe0\x9e\x12\x27\x86\xeb\x38\x98\xeb\x1d\x2b\xa4\x07\x05\xd0\x34\xbd\x8b\xf8\x95\xda\x47\x0e\x1d\xe4\xf8\x17\xb7\x56\x6d\xb7\x68\x93\x2a\x07\xf3\x33\x9c\xc1\x45\x1c\x93\xf3\x06\x49\x65\x2e\xc3\x4e\x91\x5a\xde\x20\xb2\x9e\x5d\xcb\xe5\x09\x14\xba\xeb\xc3\x24\x5a\x80\xce\xe4\x33\x6f\xc4\x1f\x9f\x1f\x3e\x82\x43\x2b\x1d\x77\x70\x61\x50\x8e\xb1\xbe\x25\xfe\xee\xef\x06\xbd\x28\x4e\xa2\x0c\x17\x7a\x81\x72\xcf\x9a\x0f\x76\xc1\x58\x03\xf9\xdd\xee\x82\xb3\xb3\x79\xe2\x58\x0f\x52\x79\x69\xc9\xa3\x95\xd0\xbb\x21\x29\x99\x93\xd0\x74\x64\x84\x43\xd1\x28\x8e\xa4\xdc\xd5\xaf\xeb\xd5\x65\xb2\xb9\xc7\x01\x7f\xff\x53\x55\x7d\x0a\x6d\xae\xa2\xb9\xaf\x07\xb6\xe6\xb8\xac\x16\x4b\xf7\xfa\xae\x02\x94\x2d\x69\x78\x83\xeb\xc3\xc0\xb6\x5e\xbd\x0c\xac\xee\x2a\x0e\xdd\x0f\x01\x8b\x47\xb1\x00\x6e\xb7\xd8\x63\x64\x65\x9c\x98\x42\xc4\xc0\x06\xf2\x1e\x36\x72\x76\x3f\xe2\x79\x74\xed\x88\x96\x42\xb6\x3c\x7a\x79\x86\xeb\x73\x35\x67\x22\x4f\x51\x98\x4b\xe3\x82\xf5\xe5\xe1\xb7\x87\x35\xfb\xb3\x0b\xdc\x73\xe8\xdc\x1d\x6c\x74\xe1\x11\x74\x94\x64\x88\x26\x9a\xf3\xd3\xca\xe9\x44\x88\x3c\x91\x92\x71\x87\xcb\x5a\xc5\xd0\x08\x17\x40\x41\x32\x05\x3a\x57\xd6\x27\x9d\x8b\xcf\x29\x96\xf4\x8d\x64\x30\x59\x08\x7b\xb6\x76\x2c\xdb\x7a\x17\x2d\x07\xc5\x46\x3e\x2d\x17\xb9\x10\x33\xba\xf4\x38\x7a\x69\x1f\x97\x59\x06\xb5\x2d\xc7\x98\x3d\x5d\x9c\xf9\x86\xe5\x7f\x85\x6f\xa4\xcf\xe2\x36\xf9\xc8\xf5\xfe\x0d\x61\x5b\xf2\xbe\x68\xe9\xfa\xeb\x37\xa1\xfc\x94\x38\x5a\x73\x62\x1b\xa5\xc3\xbf\x07\xac\xfe\x7c\xf8\xfc\x65\x05\xd1\x57\x3d\x49\x5d\x69\xd8\xdd\xb8\xba\xbb\x7a\x99\x97\x0e\x15\x80\x25\x4d\x46\x96\x22\x0e\x78\xbf\x7f\x7f\x7d\x9c\xd4\x05\x5b\xaf\x3e\x8a\xa1\x97\x14\xba\x9f\x56\x77\x55\x29\x2e\xd7\x54\x40\xd9\x7a\x69\x56\x7e\xaa\x95\xa9\x6b\x8e\xd2\xcd\xeb\xd2\xb8\xe4\x30\xa6\xa2\xcc\x06\xac\x8a\xc3\x5b\x21\x8b\x37\x21\xdb\x5c\xe1\x4a\xb6\xa4\x9b\x2f\x41\x7d\x11\x43\xec\x05\xf3\xf6\x06\x2f\xc3\x3a\xff\xfe\xfe\xe9\xd3\x06\x2b\x56\x15\xcd\x39\xf3\x8c\x48\xe7\x25\x20\xdf\x50\x7f\xc0\x0a\x75\x0d\x93\x68\x39\x3d\x6b\x56\x2d\x0c\xaf\xf4\xd8\xff\xf0\xe4\x6b\xd3\x2f\xfb\x9f\x17\x03\x2f\x36\x37\xf7\xd5\x7f\x01\x00\x00\xff\xff\xf6\x6d\xd4\xcd\xe7\x04\x00\x00") + +func etcNginxLuaConfigurationLuaBytes() ([]byte, error) { + return bindataRead( + _etcNginxLuaConfigurationLua, + "etc/nginx/lua/configuration.lua", + ) +} + +func etcNginxLuaConfigurationLua() (*asset, error) { + bytes, err := etcNginxLuaConfigurationLuaBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "etc/nginx/lua/configuration.lua", size: 1255, mode: os.FileMode(420), modTime: time.Unix(1521218836, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _etcNginxLuaUtilLua = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x91\x4f\x8f\xd3\x30\x10\xc5\xef\xf9\x14\xef\xb6\xac\xd4\x36\x6b\x77\x11\xd2\x4a\x39\xc1\xb5\x37\xc4\x65\x85\x2c\x37\x99\x34\xa6\x8e\x1d\xec\x49\xaa\x0a\xc1\x67\x47\x76\xda\x6d\x8a\x04\x17\x4e\x51\x9e\xdf\xbc\xdf\xfc\xb1\xbe\xd6\x16\x6a\x87\x0a\x3f\x7e\x16\xc5\x7a\x0d\xee\x4c\x84\xe9\x07\x4b\x3d\x39\xd6\x6c\xbc\x83\x89\x60\x7d\x24\x87\x36\xf8\x3e\x99\x3a\xe6\x21\xbe\x94\xe5\x89\xf6\x1b\x1d\xea\xce\x4c\xb4\xf1\xe1\x90\xfe\x4b\xf9\x24\xb6\x42\xca\xf7\x4f\x1f\x9e\x9e\xb7\xcf\x65\xb2\xbe\x94\x65\x74\x66\x18\x88\xe3\xc6\x8e\xba\xf6\xcd\x6c\xbf\x8a\xe5\x27\xa2\x41\x7d\xf4\xfd\xa0\x83\x89\xde\x29\xdf\xaa\xcf\x27\xaf\xbe\x68\x3b\x52\x54\xdb\x84\xd4\xae\x41\xef\x1b\xd3\x1a\x6a\xd0\xfa\x80\x31\x12\x8c\x9b\xfb\x1d\x82\xff\x46\x35\x17\xf3\x38\xed\xe8\xea\xdc\x77\x93\x62\xeb\x1c\x4b\xef\x58\xac\xc0\x72\x05\x73\x70\x3e\x90\xea\xf9\xb1\x00\xe6\x02\x3e\x0b\x54\xe0\xf3\x90\x5c\x4b\x59\xbe\xc9\x32\xc9\xa6\xcd\xd6\x5f\x55\x7e\xe2\x8e\x1c\x02\xf1\x18\x1c\x5a\x6d\x23\x81\x5c\x53\x00\xeb\x35\x9c\x77\x6b\xd6\x7b\x4b\xb9\x3a\xa2\xd6\x0e\x7b\x42\x63\x02\xd5\x6c\xcf\xb8\xf4\xd4\xdc\x65\x3e\xe4\x8a\x87\x3c\x69\xca\x5f\x48\x4b\x14\x0b\x54\x15\x58\xde\x68\x3a\xe2\x44\xd6\xa6\x6f\xf6\x47\x9c\x3a\x53\x77\xe8\xf4\x44\xa9\x14\x3d\xb1\xee\x89\x3b\xdf\x40\x29\xfa\xfe\x36\x60\xcf\xa8\x70\x20\x4e\xef\xb9\xf2\x32\xbe\x69\xe1\x3c\xdf\x36\x35\x2f\xff\xfa\xd9\xa4\x8c\x7f\xb5\x94\xae\x73\x14\xab\x49\xa4\xfb\x0c\xda\x84\x98\x72\xd1\xf8\x02\xb8\xa2\xa7\xbc\x5a\xf9\x7a\x14\x5f\xb3\x6a\xda\x2c\x55\x70\xc6\xc2\x87\xcc\xbf\x3b\xdf\x24\x56\x93\x7c\xfc\xeb\xd2\x17\x64\xb9\x9a\xe4\x82\x2c\xff\x24\xe7\x5b\x8b\xd7\xa3\xbc\x91\xc5\x7f\x93\xaf\x9b\x08\x23\x15\x49\x51\xbb\xcd\x32\x04\xd5\x5d\x66\x51\x5c\xfc\x6a\x57\xfc\x0e\x00\x00\xff\xff\xb9\x73\x37\x07\x83\x03\x00\x00") + +func etcNginxLuaUtilLuaBytes() ([]byte, error) { + return bindataRead( + _etcNginxLuaUtilLua, + "etc/nginx/lua/util.lua", + ) +} + +func etcNginxLuaUtilLua() (*asset, error) { + bytes, err := etcNginxLuaUtilLuaBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "etc/nginx/lua/util.lua", size: 899, mode: os.FileMode(420), modTime: time.Unix(1521218836, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + var _etcNginxNginxConf = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2c\xca\x41\x0a\x83\x40\x0c\x85\xe1\xfd\x9c\xe2\x41\xf7\x7a\x00\x57\x3d\xca\xa0\x89\x06\x34\x19\x32\x4f\x69\x29\xbd\x7b\x69\xe9\xea\x5f\xfc\xdf\x0d\x77\x5c\x92\x4f\x74\x3b\xda\x2e\xf0\xd5\xfc\x81\x39\x5c\x6d\x3d\xb3\xd2\xc2\xa1\xb6\x0b\xb8\x55\x42\x23\x67\xe9\x7f\xc4\x40\x67\x4d\x0e\xa5\xd9\x82\x31\x4f\x1f\x7f\x63\x68\xb6\x4c\xa5\xc8\x25\xce\x8e\xd7\xbb\x6c\x64\xfb\x76\xa9\x72\x84\x23\x54\xa7\x4f\x00\x00\x00\xff\xff\x75\xb5\xe6\xb8\x77\x00\x00\x00") func etcNginxNginxConfBytes() ([]byte, error) { @@ -85,12 +148,12 @@ func etcNginxNginxConf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "etc/nginx/nginx.conf", size: 119, mode: os.FileMode(420), modTime: time.Unix(1511087392, 0)} + info := bindataFileInfo{name: "etc/nginx/nginx.conf", size: 119, mode: os.FileMode(420), modTime: time.Unix(1519920732, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _etcNginxTemplateNginxTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x73\xdb\x38\xd2\xe0\xf7\xfc\x0a\x94\xec\xab\xbc\x54\x24\x3b\xb3\xd9\xd9\x5d\xbb\x7c\x75\x8e\x9d\xac\x7d\xeb\x24\x2e\xcb\xc9\x6c\x3d\x57\x57\x2a\x88\x6c\x89\x58\x53\x04\x07\x00\x6d\x6b\x72\xbe\xdf\xfe\x14\x5e\x09\x80\x20\x25\x67\x32\x2f\x3b\xb5\xfc\xe0\xb2\x48\xa0\xd1\x68\x34\x1a\x8d\xee\x46\xe3\xcb\x17\xb4\x8b\xcb\x12\x1d\x1c\xa1\x09\x7a\x78\x78\x22\x7f\x73\x60\xb7\xc0\xb8\x7a\x37\x35\xff\x9b\x4f\xd9\x62\xa9\x5e\x9f\x2c\x96\xf6\xd5\x39\x3f\xbf\xfc\xfc\xfd\xdb\x0a\xcf\x4b\xc8\xd5\xc7\xf0\x8d\x29\x56\x00\x2e\x45\xf1\xd3\xa7\xab\x73\x55\xe6\xac\xfd\x69\x0a\xcc\x71\x76\x03\x55\xae\x9b\x7d\x63\x7f\x98\x8f\x35\xa3\xf7\xeb\x33\xc0\xb9\xc5\xeb\x52\xbe\x98\x82\xb0\xef\x4c\x39\x9c\xe7\x7e\xa9\xe3\xf6\xe7\xc3\xc3\x13\x59\x82\x2c\x54\x27\x26\x1a\xbb\xf7\x34\xe7\x90\x35\x8c\x88\xb5\x2c\x50\x52\x9c\xcf\x56\x34\x6f\x4a\x40\x7b\x20\xb2\xbd\x6a\x49\xaa\xfb\x3d\xfd\x86\xef\x55\xcb\xfb\x59\x21\x44\x2d\x8b\xd8\x6a\xa6\xf8\x84\xd3\x43\x09\x1e\xaa\xdc\xb6\x34\x6f\x48\x99\x7f\xac\xa1\x12\x0c\x67\xa4\x5a\x5e\x50\x9c\x6b\x02\xca\x02\x39\x86\x15\xad\x10\x5d\x2c\x0e\x9f\x3c\xb9\xa3\xec\x06\xd8\xac\x66\x34\x03\xce\x81\x23\x43\xea\xc9\x0f\xea\xc3\xa5\x7b\xff\xf0\x70\x68\x3a\xb1\x14\xe8\x59\x09\x95\x5f\xec\xa4\x6e\x8e\x17\x0b\x52\x11\xb1\x7e\x8e\xf6\x65\x2b\x06\x6e\x56\x37\x33\x6c\xbe\x44\xa0\xbd\x3a\x16\xb8\xed\x42\x4d\x72\xb4\xc7\x9a\x4a\x13\x61\x52\x93\xdc\xb6\x5d\x01\x9a\xbc\xc7\xf7\xb2\x6f\xef\x48\x09\x3c\x68\x8c\x95\x64\x45\xc4\xac\xa2\x0b\x52\x82\x6c\x2d\x2c\x1a\x35\xf2\xe5\xcb\xde\x0b\x24\x69\x7a\xb0\x67\xda\xa1\x6c\xb9\x07\xd5\x5e\x4e\x33\x4d\xf0\x8c\x32\xb0\x44\x2e\xc4\xaa\xdc\x31\xed\xf0\xa2\x11\x39\xbd\xab\x66\x82\xac\x80\x36\x02\xbd\xd8\x53\x3c\xb0\xf7\x02\xe1\x5b\x4a\x72\x74\x87\x89\x20\xd5\x12\x09\x4a\x51\x49\xab\x25\xca\x1b\x26\x7f\x63\xc4\x40\x0e\xb4\xae\xd0\x07\x2d\x24\xd3\xd4\x7c\xbe\x36\x5f\x1f\x1e\xd0\xe1\x93\x27\x70\x0b\x95\xe0\xe8\xcb\x13\x84\x10\x5a\x35\xa5\x20\x33\x9c\x65\x50\x0b\x64\x1e\x5a\x1d\xaa\x6f\x76\x1c\x68\x55\x41\x26\x08\xad\x38\x72\x0d\xbc\xc7\xf7\x66\x28\xbc\xaf\x92\x4a\xb2\x62\xc3\x01\xc5\x0f\xd4\xb4\x2c\x0f\x9f\x3c\x3c\x79\x22\xe9\x66\x5a\x57\xfd\xbe\x03\x55\x41\x14\x80\x6e\x71\xd9\x00\xa2\x0b\xf5\xa3\x50\x53\x00\xfd\x73\xfc\x8e\xb2\x3b\xcc\x72\xc8\xe5\x7f\x48\x50\x34\x07\x24\xa7\x81\xfc\xd7\xd6\x5c\x02\x9d\x91\x1a\x99\x59\xa0\x68\xa4\x1b\x70\x53\xe7\x13\x07\x35\xfb\x2e\x19\x15\x34\xa3\x25\x32\x45\x18\xe0\x72\x46\xea\x99\x69\x4e\x3d\x6a\xde\x4a\xc6\x56\x25\x0f\x2d\x28\x28\x39\x0c\x55\xb3\xc4\x71\x08\xbf\xa3\x4c\x4f\x64\x47\x1a\x8f\x89\x7c\x28\x4c\xce\x4b\x4e\x6e\xc1\x23\xff\x97\x2f\x88\xe1\x6a\x09\x68\x57\xb0\x86\x0b\xc8\x65\x07\x0f\x8e\x74\x13\xaa\x2b\x57\x80\xcb\xf3\xcb\x93\xf3\xd3\x2b\x8b\x15\x07\x31\xb3\x30\x17\x8c\xae\x2c\x56\x1e\x84\x1e\x4c\xd4\x50\xe4\x58\xe0\x39\x96\x53\xb6\xe1\x90\x4b\xfa\xe6\x20\x80\xad\x48\xa5\xa9\x9c\xd1\xa6\x12\x6c\x8d\x72\xa8\xa1\xca\x25\x5b\xd2\x4a\x7f\x28\x09\x54\x02\x9d\x5f\x22\x9c\xe7\x0c\x38\xf7\x87\x60\x68\xae\xc8\x0f\xad\x84\x5a\x02\x25\xb5\x3f\x6d\x22\x30\xa2\x20\x1c\x11\x8e\x18\xfc\xd8\x10\xa6\x18\x20\xc3\x65\xd6\x94\x58\x00\x12\x4c\x4a\x8b\x0c\x2d\x28\x43\xa4\xca\xc9\x2d\xc9\x1b\x5c\x3a\x9c\x1b\x2e\xf1\xfd\x3b\xd0\xf3\x4b\x44\x34\xd6\x5c\x60\xd1\x70\x54\xe3\xa5\xc7\x32\x1a\x07\x5b\x4b\x3f\x9e\x54\x55\x9f\xf7\x14\x98\x49\x8e\xc5\xa1\x5f\x47\x8a\x23\xf7\xa4\xea\x5c\x10\x01\x27\x44\xac\xe3\x9a\x94\x2d\xd1\x70\xcd\xf3\xcb\xe3\xe9\x87\x66\x15\x57\xd4\x8c\xda\x72\x8f\xe4\x9d\x98\xf1\xf5\x9a\xf1\x59\xf0\xa9\xee\xae\xe9\xe7\x6d\x41\xb9\x98\x19\xa2\xcd\x34\x29\x66\x3f\xd1\x0a\x10\x2f\x30\x83\xfc\x20\x55\xe0\xc0\xb2\xb8\x03\xf7\x5f\xb4\x82\x29\xf9\x09\x1c\x5f\x25\xe1\x2e\x48\x29\x80\xcd\xe6\xeb\x99\xe4\xd0\x1b\x68\x05\xfa\x67\xc1\x4f\x61\x81\x9b\x52\xbc\x53\x65\xfe\x01\xeb\x3e\x16\xc5\x84\x76\xc4\x8a\x28\x18\xe0\x9c\x1f\xda\x02\xb3\x3b\x46\x84\x2f\x7d\x1c\x45\x44\x56\xcf\x2a\x5a\x37\xbc\x08\x3f\xb6\xdf\x72\x28\xf1\xba\x5b\xb1\xa4\xcb\x19\x6f\xe6\x92\xe7\x80\x8b\xe8\x23\x03\xd9\x21\x29\x7e\x73\xda\x08\x4f\x56\xb6\x45\x6e\x00\x6a\x5c\x92\x5b\x70\x52\xda\x75\xfe\x1f\x00\xf5\xb1\xfc\x84\x1e\x1e\x4c\x1f\xda\xd2\xa6\x41\xde\x2d\x7d\x65\xbf\x48\x42\xa9\x5a\x7a\xfe\x19\x61\x34\x9b\x37\x8b\x85\x5c\x1d\xe4\xb0\x84\x92\xe9\x44\x95\xd3\x32\xe9\x8d\x2a\x15\x8c\x5d\x08\xc6\xa1\xeb\x9e\x14\x98\x76\x71\x31\x3d\x28\x31\x5b\xc2\x2c\x85\x11\x0f\x80\x5c\xc8\x72\x5d\x84\x78\x8c\xcd\x9c\xe6\xeb\x44\x97\x62\x6c\xde\xd0\x7c\xdd\xdf\x25\x05\xa4\xdb\xa1\x14\x90\xa0\x43\x0a\x86\x94\x4d\xdf\xcd\x56\xf8\x7e\xb6\x20\x50\xe6\x21\x16\x1e\x8c\xb3\xeb\xeb\xcb\xef\xde\xe3\xfb\x77\xb2\x54\x80\x45\x0b\xc1\x10\x24\x02\x11\x43\xd0\x04\x71\x20\x34\x93\xae\x6b\xe0\xb3\x02\xf3\x42\x01\x8a\x91\x40\xdf\xed\xbf\xfe\xeb\xa1\x59\x05\xa4\xf6\x3b\xab\xf0\x2a\x5d\xc1\xb6\xa6\xb5\xe4\x0f\x78\x05\x67\x98\x17\xef\xf1\x7d\x80\x73\x17\xca\xbc\xc9\x6e\x40\x58\x40\x69\x28\x6f\x54\x99\x00\xd0\x0a\xd7\xa9\xfa\x9d\xce\xbf\xc7\x75\x02\x82\x02\xa1\xe5\x9c\xa6\x5d\xaa\x4b\x16\xc4\xa5\xa7\x70\xa7\xfa\x94\x80\x13\x20\xd5\x07\x27\x85\xd3\x2d\x66\x44\x4a\xd6\x24\x71\x3c\x9c\x3e\xdb\x72\x3d\xe4\x89\xe0\x74\xc6\x36\x09\xc7\xef\x98\xd6\xb9\x2a\x89\xab\x54\x3b\xf9\x8c\x54\xb6\x8b\x01\x91\xc3\x05\xe1\x53\x5b\xe1\xbc\x6a\xb7\x1b\xb4\x6a\x15\x1d\xba\x58\x38\x11\xac\x71\x25\xcb\x4a\x2a\xb6\xa4\xba\xc5\x25\xc9\x07\x5b\x39\x57\x45\xcf\x75\xc9\x6d\xe0\x6b\xe1\xa1\xd4\x70\x06\x3f\x9a\x95\x03\x45\x8f\x13\x1e\xb2\xdc\x15\xfc\xa8\x17\xa1\x13\x9a\x7b\xa4\xe8\x74\xd5\xdb\xce\xd8\xd5\x8f\x7a\xaf\x3c\x85\xcb\x2c\x37\xf2\x97\x7d\x15\x6f\x88\xda\xcd\x90\x22\x48\x95\x95\x4d\x1e\xee\xbb\xc8\x0a\x26\x6a\xb2\x6a\xb0\xb9\x5e\xde\x66\xf2\x15\x12\x70\x2f\xf6\xa4\x66\xd3\x87\xeb\x1b\x46\x45\x49\x2c\x12\x73\xfd\xcb\x62\xa8\x7f\xce\x32\xba\xaa\x67\x25\xdc\x42\xe9\xe8\xa1\xab\x5d\xa8\x77\x76\xb0\x4c\x69\x85\x4a\x54\xf0\x5a\xbd\xeb\x55\x05\x7d\xa5\xf9\xef\x3f\x29\xa5\x51\x2b\x1d\xf2\x7f\x8b\x8c\xfc\xe1\xa3\xf2\x67\xef\xb5\xd2\xe6\xe4\x0e\x5c\xae\x84\xaf\x26\xaf\xbc\x4f\x2b\x52\xcd\x4a\xa8\x96\xa2\x40\xdf\xfd\xf9\x7b\xef\x43\x88\xa7\x6c\x36\xc4\x52\x15\x92\x13\x98\x40\x8e\x70\xb5\xf6\xde\xde\x62\xb6\x4e\x0c\xa3\xfa\xb9\x83\x4e\x1a\x2e\xe8\x0a\x59\x66\x95\xfa\x21\x03\x5e\xd3\x8a\x43\xa4\x68\xdf\xbc\x44\xbb\xb7\x4a\xc7\xc6\xc1\x16\x5c\x96\xc2\xb9\xe5\x77\x85\xe3\x8d\xdc\x4d\x79\xcf\x48\xbe\xbc\x45\x0f\x0f\xa3\x24\x16\x46\x98\x0a\x7a\x03\x15\xf7\x29\x3c\x2d\xe8\x9d\x96\xa0\xd7\xfa\xdb\xa6\x29\x68\x36\xb3\x54\xf4\xd6\xd7\x42\x57\xce\x53\xa9\x9b\xd8\x6e\x8f\x74\xa9\x03\x94\x46\x70\x07\xe5\x84\xab\x5d\xd5\x1d\x66\x15\xa9\x96\xdc\x88\x15\xb9\xcb\x26\xb8\x24\x3f\x41\x3e\xb3\xa2\x6a\x26\xcb\x18\x2b\x80\xae\x7c\x9c\xe7\x44\xaa\x3d\xb8\x44\xf8\x16\x93\x52\x41\x72\x92\xed\xc0\x94\xda\x55\x8b\x49\x8d\x33\xb0\x2f\x48\xb5\x94\xdb\x05\xb5\xca\xd8\x77\x92\x56\x24\x83\xf6\x9d\xd4\xc0\x16\x94\xad\xb0\x40\x4d\xcd\x05\x03\xbc\x22\xd5\x82\xfa\x64\xbc\xa0\xcb\x77\xaa\xc4\x5b\x9e\xe1\x1a\xfe\xf7\xf4\xe3\x07\xf4\xf0\x00\xea\xc7\xd1\xbf\x38\xad\xda\xfe\x3e\xb5\x93\xda\xd5\xf9\x64\x80\xda\xa9\xfd\xf4\xd0\xdb\x13\xad\x70\x8d\x1a\x56\x72\x24\x0a\x2c\x10\x2f\x68\x53\xe6\x8a\xfc\xb8\xae\x01\xcb\xad\x06\x92\xdb\x67\xce\x27\x25\x5d\x7e\xdd\xb6\x47\xf6\xcf\xb7\x15\x68\x78\xb3\x00\x9e\x44\x63\xd7\xa8\x84\xb3\x86\x11\xb4\x5b\xd2\xe5\x52\x91\x59\xef\xa5\x43\x4e\x66\xf0\xe3\x27\x46\xdc\x76\x71\x7a\x43\xea\x63\x05\xf5\x82\x2e\x3f\x5d\x5d\x38\x36\xb1\x32\xd5\x94\x7f\x78\x40\xfb\x87\xa1\x1c\xf4\x44\x18\x32\xf3\xb8\x2b\x27\x4e\x35\xef\xb8\x26\xdc\xa4\x69\x7b\xa2\xb8\x05\x75\x37\xd2\x1d\x09\x38\x5d\xf3\x32\x09\x81\xab\x0f\x07\x7a\x2a\x1d\x39\xf5\x43\xbd\x3d\xa3\x5c\x6a\x6c\x07\xe1\xdb\x4b\xca\x94\xd5\x23\xe0\x1a\xb2\x38\x72\xb4\x4b\x62\xe4\x35\x69\xc1\xb9\x8e\x5d\x62\x51\x6c\x09\xb1\x25\x61\xbf\x7c\x4d\xf5\x18\x18\xa3\xec\x67\x76\xd8\xbe\x7d\x2b\x61\x5d\xd0\x65\xb8\x30\x44\xfd\x6d\x1b\xec\xd4\xb3\xdd\xdd\x0c\x2f\xec\x9f\x9a\x5f\x57\xc0\x69\xa9\xcc\xb0\xaa\xae\xfd\x19\x70\xcc\x79\x7d\xfb\xfd\xe9\x87\x69\x68\x86\xf8\xa1\x80\x0a\x64\x49\x35\x71\x90\x96\xf9\x5c\x99\xc0\xf4\x1e\xec\x8e\x88\x42\xaa\xe8\x18\x8d\x5a\xfb\xd3\xc8\x48\xf8\x97\x6a\x6f\x9f\xf8\x80\x08\x47\x1c\x04\x12\x14\x8d\xb2\x92\x72\x18\x45\xd3\xf5\xae\x80\x0a\xad\xf0\x8d\xb2\xbf\x15\x80\x84\xdc\xa1\x08\xdb\xea\x04\xa1\xeb\x82\x70\xb4\x02\x5c\x19\x69\xb0\xa6\x0d\xca\x70\x25\xa5\x01\x27\xab\xba\x5c\x2b\x7b\x54\x08\x74\xa4\x75\xce\x56\x14\xa3\x16\x33\xb4\xab\xe6\x7f\xe6\xa1\x2a\x57\xa7\x1f\x60\x3e\xa5\x52\x4f\x44\xbc\xa9\x6b\x39\xa4\x73\xc8\xb0\x04\xad\x0c\x17\x84\xa3\x0c\x73\xd0\xfd\x8c\x1a\x4b\xf4\xfa\x4e\x49\xac\x39\xb8\xbe\x8f\x54\x47\x15\x81\x25\x04\xca\xc8\x92\x48\xc1\x6d\xa9\x9b\x13\x2d\xe0\x0a\x7c\x0b\x7d\x24\x8e\x09\x47\xb2\xc2\x34\x24\xc9\x83\x2a\x3a\x8c\x8a\x31\xc0\x74\x08\x3c\x25\x55\x06\xba\x8b\xba\x6c\x0e\xb7\x04\x0b\x40\xca\x98\x15\x36\x5a\x49\xd9\x5d\x1a\x1e\x99\x43\x81\x6f\x09\x65\xe8\x0e\x34\xde\xce\x36\x48\xb8\x94\xd4\x8c\xe2\xac\x98\xb4\x10\x76\xd0\x15\x08\x6c\xd0\xb0\xe2\x4d\x83\x2a\x70\x95\x97\x4a\x2f\x5c\x20\xb7\x07\x1f\xe4\xb8\x56\x40\xab\xe1\x6c\xea\x25\xc3\x39\xa0\xdd\x76\x5c\xdd\xbb\x2f\x1d\x99\xea\x1e\x53\xe4\xd0\x95\x78\xfa\x34\x52\x7e\x15\xd3\x06\x22\x58\x36\x6a\xa7\x9b\x6f\x75\x1c\xb0\x43\xa2\x5d\x51\x80\x35\x12\x3a\x3b\xec\x46\x33\xa9\x26\xda\xdf\x21\x30\xf2\xa9\x51\x51\xc5\x91\x2d\xdf\xdf\xbf\xdd\xd0\xaa\x3a\x93\x40\x92\xf2\x28\x5d\x9b\xc1\x8a\x0a\x88\x6a\xb5\x32\xd6\xa9\x31\xca\xd4\xa9\x56\xde\xd9\xbd\xd4\x1a\x34\x05\x74\xb3\x4e\x07\xcc\x28\x63\x90\x89\x72\xad\x2c\x85\x99\xe4\x30\xce\x4b\xb9\x46\x95\x14\xe7\xa4\x5a\x46\x43\xda\x85\xb4\x5b\x63\xce\x67\x66\xa9\xe0\x59\x01\xab\xc1\xc1\xed\x01\x33\x30\xd8\xbb\x1a\xe8\x61\xd8\x3b\xb5\x9b\x92\xe8\xa6\xda\xc7\x55\x6e\xab\x21\xcc\x40\x11\x41\x4e\x84\x05\x65\x19\x28\xf1\x99\x13\xd9\x6d\xd7\xb9\x91\x29\x7d\x90\x80\x36\x92\x24\xd7\xe5\x67\x82\x2a\x45\x85\x0f\xf5\x70\xbf\xed\xcb\x48\xe9\x3d\xf2\xcf\x48\xbf\x78\x15\x7d\xe3\xde\xc7\x57\x1d\x86\x4e\xd0\x4a\xca\x40\x8d\xa3\x51\xa4\xd5\x9b\x01\x6c\x7a\x80\x0c\xd0\xdb\x3a\x10\xbd\x72\xe1\x7a\x8d\xcb\x72\x72\xce\xa7\xd3\x8b\x4b\xcc\xb9\x28\x18\x6d\x96\x85\xe7\x2d\xd4\xe3\x23\xf1\xd7\xb8\x69\x0f\xe5\xe4\x82\x70\x01\x95\x5c\x97\xf9\x44\xd6\x55\x93\xe5\xe1\x41\x0e\xcb\xeb\xd7\x7f\x52\xe2\x3e\xe1\xe8\x90\xe5\x5b\x7a\x74\x3a\xae\xdf\x44\x34\xd8\xd4\x62\xf0\xbc\x7e\xfd\xa7\xc3\xa1\xa9\x1a\xb5\x68\xe9\x81\xba\xb3\xf5\x67\x62\x78\x76\x7d\x7d\x39\xfd\xd6\xe8\x05\xfb\x9a\x8f\x73\x25\xe8\xe7\x60\xc4\x02\x2a\x28\x17\x11\xb3\xc9\x57\x52\x30\x12\xae\xff\xdd\x38\x93\x65\xa9\xa1\xc9\xdb\x7e\x1f\x64\x6c\xdd\xae\x44\x6d\xd6\xe2\xf1\x28\x31\xb2\x09\x11\xd7\xa7\x3e\xd5\xfd\x84\xae\xea\x46\xc0\xbb\xa6\x2c\x83\x15\xc4\xb1\xf4\x0f\x20\x75\x9c\xa7\x42\xad\xa7\x46\x88\xcb\xcd\xb0\x8f\x85\x64\x63\xab\xa3\xc8\x15\x55\x2e\x2f\xce\x1d\x67\xe0\x30\xa8\x4b\x9c\x01\x37\x05\x9c\x34\x57\xae\x4e\x4e\x69\x35\x40\x27\x09\x7f\x77\xd1\x94\x65\xe7\x6d\xc0\x5d\x76\x9a\x9e\x6c\x58\xc8\x3a\x74\x1d\x25\x9b\x7c\x99\x5c\xb3\x46\x03\xe4\x1e\x6d\xa8\xb0\xcd\x4a\xd7\x8b\x8b\x26\xea\xcc\x23\xdd\x30\x2a\x83\xe5\xf5\x34\x71\x8b\x27\xea\x35\x59\xc8\x5d\xf8\x8c\x54\x33\xbb\x18\xb4\x1b\x39\x39\xf3\x82\x2f\xe6\x69\xed\x02\x0c\x94\x3b\x46\xef\x2d\xbc\xc7\xf9\x46\x38\x2f\x1d\xad\x5a\xdb\x8f\x96\x5a\xe6\xa5\x33\xeb\xed\x20\xd1\xb0\x0a\xd1\x0a\x71\xe0\xca\xb0\x94\xe1\xac\xd0\xbe\x72\x94\x33\xcc\x05\xc9\x70\x29\x97\xf4\x55\xcd\xe8\x2d\xa0\x1a\x98\xb2\x1a\x54\x19\xc4\x4c\x3f\x9d\x5e\x4c\x35\x90\x13\x9c\x15\x6e\x3c\x24\x3a\x06\xf8\x2c\x53\x1f\xa4\x66\x25\x48\x75\xf0\x6a\x7f\x7f\xdf\x3a\xc6\xa6\xd3\x8b\x03\x0f\x55\x1f\x50\x68\x40\xf7\xa0\xc5\x0e\xfa\xb6\x5e\xeb\x6e\xe8\xb1\xcb\xe0\xb2\xa4\x77\x28\xa3\xd5\x82\x2c\x75\x2c\x80\x54\x55\x2c\x0d\x04\x91\x1b\x05\x9e\x68\x50\xbd\x4f\x77\xfa\xda\x7c\xdc\x68\x8e\x6d\x8d\x4d\xcf\x60\x55\x8b\x75\x1a\xd0\x3f\x60\x8d\x9e\xa7\x68\xa8\x91\x50\xfe\x3e\xcf\x40\x6a\x50\x9b\xdc\xc0\xba\xa7\xcb\xbc\x24\xcb\x42\x6a\x67\x0c\xf2\x26\xd3\x22\x45\x52\x70\x2c\xe8\x78\x41\x18\x17\xe3\xf9\x5a\x80\x6b\xce\x77\x0e\x79\x04\x8e\xbc\x41\xc3\x1d\x3a\x21\x75\x01\x8c\x3f\x6f\xe5\x5e\x97\xee\x99\x36\x24\x4a\xf2\x67\xba\xb8\x43\xc1\xfc\x46\x4f\xbd\xf6\x0d\x48\x6d\x50\x6a\xb9\x1d\x14\xae\x7a\x72\xd9\x6a\x3d\xb6\xcb\x5e\x6c\x4f\xcf\x2e\x31\xc3\xab\x2e\xb6\x1a\xc3\xd3\x33\xa4\xe2\x58\xb6\xb4\x3f\x49\xbc\x7c\xfb\x93\xfc\x9d\x17\xb5\x6c\xc1\xe1\x6d\x7e\xfb\xf4\x35\x48\x0c\x9b\x91\x9d\xa1\x52\xab\x4a\xa7\xeb\x0a\xaf\x48\x76\x7d\x31\xbd\x82\x8c\xb2\x9c\xfb\x6c\x93\xaf\xa5\x30\xc9\xd4\x40\xce\x4a\x6a\x55\xca\x58\x2e\xf1\x72\x06\x59\x5e\xcc\xb2\x86\xdd\x06\x03\xfe\xf6\xe4\xf4\xec\x44\xbd\x8c\xc6\x7b\xa2\x4d\xc0\xca\x7a\xc1\x5b\x9a\x19\xc3\xb0\xb2\x7f\xa8\x28\x00\x3d\x9e\x5a\x84\x93\x4a\x00\xcb\xa0\x16\x33\xd0\xd5\xfa\xc7\xc8\xd8\xdc\x80\x31\xe5\x88\xb0\x46\x37\x0d\x5e\x2a\x38\x61\xc3\xda\xde\xa2\xa2\x0e\x24\xf2\xb6\xda\xc3\x03\x3a\x42\xff\x4b\x8f\xe0\x2c\xfc\x70\x18\xb5\x69\x4c\x0a\xde\x4c\x63\x20\x97\xde\x94\xfb\xff\x58\x32\x86\x09\x4c\xd3\x26\x60\xb7\x15\xf4\x60\x29\x8d\xca\x28\xa2\xba\xd4\x86\xce\x9a\xb2\xb6\xaf\x67\x24\x87\xd6\x60\x6e\xdc\x6c\x24\x07\xdf\x64\x5e\x0c\x86\xc2\xa4\x79\x5d\xa9\x87\x15\xa9\x6b\x10\xcf\x3b\x03\x97\x49\xea\x70\xfd\xd5\x4d\x54\xc8\xad\x75\xc1\xbe\xc1\xca\xd4\xa2\x7f\xad\x70\x6d\x5b\x8b\xe1\xf7\x5b\xeb\x4c\x97\xe5\x4a\xf8\x12\xed\x5a\xd3\x9f\xea\xfb\xdc\x8b\xf8\x6b\x7b\x01\x3f\xb6\xc5\x26\x46\x54\xda\x80\xb5\x89\xfd\xe7\x7a\x5d\x03\x1a\x65\x94\xde\x10\x18\xd9\xfa\x0e\xb8\x5c\xcd\x6e\xd6\x63\x89\xa7\x83\xf4\x01\xaf\x14\x9b\xb4\x3a\x8f\x2e\x85\x0a\xcc\x8b\xa3\xa0\x68\xdc\xe8\x89\x6a\x26\x7e\x7b\x86\xb9\x32\xef\xc9\x9e\x7d\x4d\x7d\x8b\x90\x12\x34\xb4\x2a\xd7\x86\xfd\x5a\x4a\x3c\x5b\x9a\xe9\x6f\x6d\xec\xff\xb0\xf1\x0d\x7e\xe0\xd8\xfe\x73\x5f\x23\x72\x21\x10\x6e\x94\x06\x2b\x5b\x7e\x4a\x8c\x5d\x38\x7e\x5a\xe6\xaa\x61\x73\xfd\x7c\x5b\xe5\x35\x25\x95\x5a\x0b\xcd\xf7\x36\x96\x74\x72\x6c\xec\x1c\xff\x0f\x69\xf7\xc3\xf9\xa5\x35\xb9\x9a\x02\xd6\xde\xaa\x62\x03\x30\x29\xf9\x91\xf7\xf1\x3d\xbe\x7f\x27\xdf\xc9\x02\xf2\xa3\x55\x02\xfc\x32\xb2\x40\xac\x01\x24\x3a\xd2\xf2\xa2\xff\xd6\x31\xcb\x06\x2e\x69\x1d\x1e\x38\x7f\x83\x4b\x5c\x65\xa4\x5a\x9e\xa8\xf9\xe0\xb1\xb3\xf1\xa3\xd8\x22\x70\x5c\x2e\x29\x23\xa2\x58\xc5\xe4\xfc\xcf\xb0\x7e\x83\x61\xed\x1f\x55\x65\xdc\x54\xe3\xa5\xa4\xd8\x0a\xd7\xc6\xda\x7c\x47\xca\x12\xcd\x4d\xb4\x24\x6d\x4d\x41\xb2\xd4\x0f\x05\x11\x50\x12\x2e\x82\xd8\x47\x43\x21\x52\xe5\x70\xff\x32\xa0\x14\x6f\x03\xa4\xc3\xb2\x25\xcd\xb4\xbc\x6c\x4b\x4d\x2e\xcc\x3b\xbf\xf8\x6e\x8d\x45\x21\x0b\x19\xce\x32\xb5\xda\xfa\xa1\x5c\x27\xdc\x16\x51\xeb\x11\xe4\x61\xc9\xb6\xa0\x8b\x10\xb6\x9f\x27\xae\x6b\x93\x93\xf3\xd3\x2b\x13\x23\x6c\x16\x82\x53\xa8\xd6\xca\x86\xf2\xe5\x0b\xaa\x19\xa9\x84\xc3\xf9\x8c\x72\x21\xc5\x1a\x32\x98\xb6\xd1\x7d\x91\x01\xd4\xcc\x0d\x09\xc9\x46\x58\xa0\x67\x3d\xb0\x46\xb3\x91\x81\xf7\x3c\x9c\x61\x9e\x83\x2c\xc1\xa1\x26\x6e\xb3\xa7\x47\xb1\x2b\x4e\xb9\xdb\x3b\x6e\xb8\x78\x6d\xda\xfe\x57\x34\xc0\x4c\x45\xcd\x3f\xd3\x11\x79\x57\x58\x80\x0a\xa5\xe0\x2d\x4b\x78\xeb\xac\xfc\xac\x22\x32\xb4\x8f\xb0\xb4\xb2\x25\x4d\xca\xdd\x3b\xdb\xaf\x99\x29\x7e\x7e\x9a\x26\xd3\xfe\x61\x3f\x95\x58\xd9\xd2\x27\x4d\x9a\x57\x1d\xd2\x6c\x83\xae\x32\x2c\xf4\x60\xb8\xab\xc3\x4e\x7a\xb0\xde\x0f\xa3\x4e\xa4\x90\xfa\x2f\x5a\x81\xe3\x16\x7f\x82\xbf\x42\xa3\xd1\x80\x35\xca\x9b\xdb\xb8\x2c\x8d\x25\x44\xc5\xb2\xe6\x88\xc9\xb9\xac\xd1\xff\x89\x56\xc0\x27\xe8\x2d\xce\x0a\xa4\xdc\x4b\x7a\xa2\x98\xa2\x1c\x61\x94\x83\x36\x5b\xe7\xaa\x6c\xe4\x19\x79\xf5\xfe\x0d\x1a\xff\x4f\xf4\xea\x7b\x24\x0a\xda\x70\x5c\xe5\xe8\xfb\xd7\x6a\xcb\xa4\x42\x5e\x81\x23\xca\x10\x9e\x4b\xe1\xf4\xd7\xb6\xc8\xab\xef\xfe\x1a\x94\x49\x08\x12\xd5\x96\xe4\x1e\xed\xdf\xb3\xcc\x23\xa9\xd1\x32\xd0\x73\x5f\x4a\xa8\x1a\x7d\x2c\xb9\xf7\x02\xbd\x51\xb4\x30\x82\xc9\x1a\x12\x38\x7a\xb6\x60\x74\xb5\x27\x28\xba\xbb\xbb\x7b\x9e\xc2\xa4\x30\x53\xf2\x25\xda\x15\x54\x1d\x9a\xb8\x32\x95\xa7\xa1\x64\xb3\xd2\x3f\xc1\x70\xd6\x8b\xa1\xe2\x3d\x8c\xd5\xe8\x0d\xa9\x72\xb3\x3c\x9c\xd7\xb7\xaf\x7d\x06\x2c\x95\xd5\x12\x99\xf3\x1a\xaa\xa6\x59\x35\x52\x36\x4d\xf4\xf0\xb0\xd9\x20\x15\x05\x9a\x47\x91\x1e\x83\x8d\x6e\xb6\x48\x6f\xb2\x07\x77\xdb\xd6\x66\x80\x21\x2b\xed\xd7\x77\xc9\xfd\x23\xf7\x6f\x83\x06\x31\xbf\xcb\xbf\x06\x61\xff\x40\x94\x0c\xa3\x36\x4c\x13\x9d\x73\x4d\x5f\x33\x13\xbe\xff\xcf\x4c\xf8\xe6\xe3\xb7\xcd\x2c\xf8\x3f\x07\x07\xff\xf7\x57\xa2\xac\x6d\xea\x0f\x42\xcf\xce\x5c\x88\xde\x78\xe6\x6d\x6d\x9d\xb0\x4a\x9e\xb3\x1d\xb5\x73\xa8\x82\x3e\xc4\x5f\xbf\xfe\x53\x37\x94\xca\x78\x4d\x95\xf7\x4b\xae\x96\x4a\x9b\x5c\xa0\xd1\xc1\xff\xb8\x1d\xf5\x00\x0a\x76\x4a\x0c\x94\xa5\xdb\x92\xeb\xc4\xd8\x29\xec\x0a\x67\xad\x45\xd6\x79\xbb\xb7\xa7\x8e\xf8\x50\x43\xe1\xb0\xfd\x87\x07\x3f\x6a\x6c\x90\xe5\xbe\xbe\xd9\xfe\x26\xfa\x15\xd8\x47\xed\x51\xb4\x82\xb7\x23\x55\x13\x26\x50\x77\x47\x77\xd6\x0e\x5e\x7a\xd5\x8f\x47\xbb\x5b\x2f\xd8\x20\x96\x04\x77\x76\xa0\x02\x56\xb5\x3a\x68\x34\x9a\xbe\xbd\xfa\xfc\xf6\x6a\x64\x80\xda\x8d\xb4\x54\xe8\x2c\xfa\xdd\x1d\x73\xc7\x88\xab\x0a\xc6\xa6\x2d\xf4\x8d\xcc\x5b\xa8\x13\x9f\x1f\x19\xb9\x12\x63\xd1\xe9\xe6\xc9\xa7\xe9\xf5\xc7\xf7\xb3\xb7\x57\x57\x1f\xaf\xa6\x9a\x71\xc3\xc1\xdc\xd9\x51\x00\x86\x87\x23\x6d\xe1\xb7\x3b\x01\x5d\xe1\xa5\x3e\x6f\x26\x37\x72\x1f\xfe\x7e\xfe\xe1\x9f\x48\x1f\xbb\xcd\x0a\xc8\x6e\x54\x54\x83\x8e\x4c\x90\xbb\x5e\x1d\xa3\x23\x55\x54\x9e\x1e\xe9\x1d\xf4\xc9\x38\x21\xfb\xfd\xf0\xf6\x20\x14\x7a\xc6\x70\x95\xd3\x95\x39\x78\xf8\xaf\x86\xab\x08\x29\x7d\x12\xf3\xa6\xa2\x77\x95\x02\xc2\x9f\x23\xcc\x1d\xca\x0a\xac\x44\x55\x9b\xd5\xfd\x71\x2b\xb0\x7c\xb7\xd4\x51\x47\x1a\xa6\xa7\xb3\x67\x85\x62\x75\x52\x1d\x78\x75\x74\x38\xc4\xde\xde\x92\x88\xa2\x99\x4f\x32\xba\xda\xbb\x69\xe6\xc0\x2a\x10\xc0\xf7\x4c\x78\xec\x58\x3b\x4e\xe6\x25\x9d\xef\xad\x30\x17\xc0\xf6\x32\x5a\x09\x46\xcb\x12\x18\x37\x6e\x95\xfa\x66\xb9\x97\xad\x72\xef\x8b\x31\xfc\x2f\xe9\x36\xba\x55\x4b\x14\x1b\xb0\xde\x8e\xab\x2f\x99\xaf\xa0\xe1\x60\x0c\x24\xca\xea\x2c\xe9\xd1\xea\x24\x73\x9c\xdd\x94\x74\x79\x64\x9b\x78\xa3\x7f\x07\x8e\x31\xd4\xaf\x9c\x6c\x5a\xf6\x7e\x1d\x2c\x53\xab\x85\xb0\xce\x60\x6b\x64\xd2\xc2\x64\x34\x1e\x79\xcb\x85\xb3\x69\x44\x67\xc7\x83\xfd\x24\xea\x09\x8c\x8d\xe4\xf0\x77\xfb\xde\x36\xf9\x21\xd1\x86\x1e\x5e\x7b\x50\x22\x84\xdf\x8f\xaf\xf2\x6b\x54\xb8\xf4\xd1\x46\xa9\xa8\xd4\xce\x89\x41\xfb\x24\x4f\xf8\xe5\x84\xd7\x25\x5e\x1f\x6e\x5d\xd2\x46\x74\xeb\xc3\x10\x11\x26\xf1\xd2\xb4\x89\x64\x5c\x34\x73\x4b\x08\xeb\xa7\xf1\xc1\x85\x83\x99\x24\x66\x44\xc0\x01\xc7\x91\x7d\x3a\x81\x9d\x08\xa1\x7f\x8e\xd5\x32\xf9\x7a\xff\xf5\x26\x24\x86\x47\xc9\xfe\x1c\x1b\x36\x1f\x1b\x47\xc3\xe8\x30\x81\x42\x8d\xb9\x77\x50\xc6\x38\xfd\xfa\x20\x24\x79\x6a\x7b\xb9\xff\xf0\xe4\x89\x35\x3a\x3f\x41\x61\x6c\xbe\x3a\x28\xd9\x1a\xa4\x83\xb0\xfc\xa9\x7e\x9f\x3a\xa3\xf3\x33\x62\xc7\xb7\x89\xd4\x6e\xb1\x4a\xba\x9d\x36\x07\x3f\xbb\xf0\x83\xeb\x93\x4b\x64\xce\x26\xf0\x58\x7b\x79\x89\x76\x45\x56\x4f\x9d\xf2\x32\xb9\x3e\xb9\x7c\x13\xf9\x86\x9c\xa5\x5d\x64\xb5\x72\xec\xb8\x1a\xd6\xe0\x1c\xbd\x35\x00\x94\x19\x4b\x9d\x9a\x18\x2e\xd2\xff\xd5\x85\x85\x47\x68\xff\xeb\x25\xda\x05\x63\x2a\x57\x2a\x57\x5b\xd5\xb7\xa0\x47\x5a\x14\xea\x3c\xca\x5b\x69\x2a\x38\xeb\xba\xd9\x12\xba\xf7\x06\x89\x74\xf0\x26\xfa\x25\x4c\x35\x49\x3c\xa3\x1d\x6b\x67\x0c\x0c\x67\x26\x88\xe8\xef\x47\x26\xa7\x90\x19\x7d\x78\xe3\xfe\xaa\x7f\x77\x97\x44\xf0\x57\xc2\xe8\xd7\xb5\x15\xfc\xfb\x0d\x85\x53\x41\x7e\xab\xf1\x88\xde\x68\x20\xfd\x67\xb2\x75\x6a\x19\x25\x60\x52\x9e\xa7\xd4\x4a\x81\xf4\xd1\xf7\xdf\x44\x16\x75\x34\xc1\x4d\xe4\x7c\x5b\x19\x72\xc6\x5d\xb2\x16\x02\xf7\xf8\x0a\xc0\x36\x0e\xb7\x1d\xf4\xe9\x74\x50\xb2\x37\xb9\x2f\xd9\x3f\x9d\xf6\x4b\xf6\x26\xd7\xd4\x74\x35\x02\x6a\xb6\x6f\x7b\xa9\x99\x2e\xd2\xff\x75\x6b\xc9\xde\x56\xfd\x95\x25\xfb\x6f\x27\xda\x3b\x83\x20\x87\xe7\xab\xc5\xf2\x16\xd0\x7e\x7f\x22\xf5\xdb\x91\xc0\x89\xc3\xaf\xa1\x43\x52\x94\xd9\x33\xb8\x3c\xe8\x40\x24\xca\xae\x5c\xa1\xae\x30\xfb\xe6\xb2\xf0\xb7\x9a\xbd\x71\x68\xb6\x21\x97\x4d\x34\x95\x83\x0a\xb7\x51\x49\x45\x16\x4e\x4f\xe7\xad\xa5\x82\x41\x0d\x82\x68\x0f\xbd\xc9\x27\xa5\x2b\x75\x95\xf9\xc8\x56\x59\x47\xf9\xc8\x7a\x72\x94\x75\x59\xd6\x8b\x75\x53\xec\xda\x17\xeb\x86\xfc\x3d\x56\x3a\xb8\x2d\xda\x78\xd9\xfd\x69\xb4\x3d\xed\x0b\xca\x73\xb1\xc6\x61\xc1\x70\x57\xd6\x6e\xcc\x50\xc4\x2d\x5e\x8c\xdd\x76\x50\xf4\x76\xc6\x2b\xa9\xa3\xb5\x75\x06\xad\x2d\x61\x7c\x34\x27\xee\xc6\x9f\xae\xce\x35\x8c\xa4\xfd\x74\x10\x46\xcb\x7b\x16\x0f\x77\xb6\x7a\x4b\x08\xe7\xc6\xb6\xa4\x58\x54\x41\xf0\x0f\x63\x6f\x09\x64\xaa\x57\x4d\x0f\x88\x7f\x7a\x3b\x1a\x1a\x13\x0e\x8e\xa2\xe7\xd9\xe4\xc5\x73\xb4\x87\xe6\x0c\xf0\xcd\xe6\xed\xed\xe3\x76\xb8\xf6\xbf\x76\x56\xc5\x69\xdc\x4e\x3e\x5e\x4d\xdd\x39\x4b\x75\xa0\xcd\x9a\xe4\x56\x24\x2b\x08\x94\x37\xb8\xbc\x59\xe1\x4a\x99\xe6\x8c\x35\xd6\x98\xdc\xc6\x19\x65\x7c\x4c\x6b\xa8\xc6\x81\x31\xd6\x4b\x5d\xe5\xcf\xc4\x60\x02\x2a\x51\x45\xcd\x94\x3b\xa1\x8c\x1b\x33\xb2\xfd\xbe\x83\xe4\x4b\x74\xc9\x60\xa1\x82\xa1\xd1\x0a\x44\x41\x73\x8e\x2a\x80\x9c\x23\xdc\x9e\xb7\xa7\xb5\x9e\xf9\xb8\xca\x51\x4e\x16\x0b\x60\x50\x09\x74\xa5\x8d\x48\x92\xb9\x35\x40\xb2\x40\xcf\x1c\x9f\x69\x60\xe8\x08\x3d\xfd\x78\x79\x7d\xfe\xf1\xc3\xf4\xe9\x73\x6f\x1a\x76\x72\x07\x3c\xd5\xbb\xea\xf1\x89\x36\x2d\x8e\x55\x0c\x8f\x61\xe3\x03\xd7\x15\xd5\x0d\xf5\x49\x7f\x69\x03\x9f\x91\xb7\xe3\x0f\x0a\x9e\x30\xc8\xa1\x12\x04\xeb\x70\xaa\x2d\x1b\xf6\x6a\xa5\x5a\x0f\x81\x3e\x3d\x4c\xac\x40\x5b\x36\xf4\x5e\xd3\x3c\xd5\x88\xf9\x14\xf6\x71\x4b\xb0\x46\xb2\xa6\xc0\xb6\x42\xf7\x31\x60\xdf\xe3\xfb\xf1\xf1\x12\x22\x80\xef\xf1\xfd\xf1\x12\x36\x81\x92\x30\xa0\x12\xe3\xeb\x75\x0d\x07\x3a\x3f\x49\x5d\x62\x52\xa1\xac\xc0\x8c\x83\x38\xfa\x74\xfd\x6e\xfc\xd7\xad\x40\x5c\xa8\xb4\x1e\x07\x68\xdf\x2b\xed\x8c\x99\xd6\x20\xe6\x59\x9d\xfe\xc3\x67\xbf\x0f\x3e\xeb\xc8\xc4\x50\xe3\xd0\xca\xfb\xd8\x19\x08\x93\x7a\xc7\x1d\x11\x85\x2d\x89\x95\xfb\x2c\x96\x7f\xd6\x6b\x16\xa9\x20\x36\x8d\xeb\x3b\xc2\xba\x01\x5f\xad\x37\x70\x32\x85\x8c\x76\x14\xcb\xdf\x7d\x24\x4f\x1b\x0f\x9e\x88\x25\xfc\x65\xbd\x18\x5f\xbe\xa8\x03\x5e\xbf\x59\xac\xcd\xef\xad\xeb\xc9\xdd\x99\x0e\x74\xf8\x37\x0e\x90\xf9\x4d\xa9\xfc\xbb\x08\x64\xf9\xfd\x51\x60\x73\xe8\xc9\x56\xce\x44\x25\x8a\x35\xa9\x10\xed\x71\xda\x7a\x51\x37\xf6\xfc\x6d\xaf\xdb\xdb\x1d\xb5\x26\x26\xbf\xab\x09\x24\xb8\xbe\x98\x22\x5e\x11\x6b\xa4\x71\xd1\x96\x0e\x07\x95\xf6\x44\x8f\x23\x30\xb4\x6a\xb8\x40\xb8\xbc\xc3\x6b\xae\x53\x6d\x44\x76\x38\xd0\x13\xe9\x65\x70\x20\x78\xfa\xe1\xbc\x85\x60\x0e\xb6\x72\x75\x96\x93\x36\x2c\x03\xa4\x92\xb2\x2e\xa8\x44\x89\x88\x49\x8c\x43\x1c\x40\x61\x06\x7a\x3a\xbd\x38\x01\x26\xc8\x42\x85\xc2\x3e\xff\x65\xd7\x86\x6f\x1d\x16\x85\x7e\xbd\x38\xc1\xdf\x5e\x12\xab\x33\x93\xdd\xae\xa8\x74\x97\xe8\xe1\x41\xa5\xc7\x7c\x94\x38\xf9\xcf\x80\xfc\x66\x03\xf2\x2b\xae\xa3\x8f\x98\xf9\x7f\xbc\xf0\xd0\x3f\x08\xbb\x44\xf3\xf7\xf1\x43\xfa\x6f\x1f\x97\xfa\x07\x19\xc8\x4d\x5a\x8d\x52\x15\x32\xba\x5a\x41\x25\xd0\xe5\xdb\xf7\x88\x17\xd8\x4b\xd6\xee\xd2\xc9\x67\xc2\x44\xc2\x71\xab\x80\x2c\xa5\x56\xa0\x0e\xb3\x84\x31\x8d\xb8\xca\xbd\xdc\x45\xed\xed\x07\xb6\xc5\x1d\xdb\xcc\x81\x1f\x7c\x28\x47\x1c\x56\x27\x05\x64\x37\xbc\x59\x05\x7a\x17\x2f\x67\x59\xcb\x63\xa8\xef\x09\x81\x79\x5c\x19\xd0\x24\x82\xa6\xb2\x1c\x7c\x3d\xb4\xa1\x79\xf1\xae\x29\xcb\x93\x02\x93\xca\x9f\x20\x51\xbf\x6c\x86\xff\xa1\xfe\x85\x98\xa4\xa0\x76\x3a\xc8\x05\xae\x55\x32\xb4\x81\xc7\xf7\xb7\xfa\x75\x66\xb7\xc0\xc8\x22\x4d\x94\x7e\x1f\x2d\xea\x8d\x4c\x4d\xd3\xe7\xb8\x11\xc5\xf5\xc5\x54\xb9\x1d\xa2\x38\x5a\x3f\xa2\xd7\x2b\x95\x88\x79\x7e\xbd\xff\xa7\xa4\xd4\xda\xdc\xbc\x47\x3c\xd9\xc6\xe4\xe4\xf8\x1d\x29\xe1\x03\x5e\x41\x84\x4c\x8a\x55\xe3\xca\x97\xb0\x9a\x9e\x1d\x77\x58\x56\xa7\x30\x1f\xe4\xdc\x01\xa0\x2d\x46\x9d\xd1\xd5\x03\x64\x1a\xe8\x19\xdd\x01\xc8\x9f\x55\x75\x9d\x39\xbd\x0f\x76\x0e\xb5\x28\x7a\x40\x0f\xc2\xd6\xa7\x5b\x09\xad\x4e\x15\x84\xad\xe6\x4a\x0c\x44\x0d\xf7\x25\x5e\x06\xb3\xc5\x4b\xbf\xf0\xfa\x6f\x7f\x46\xaf\xff\xf6\x3d\x3a\x1a\xc2\xc4\x01\xd9\x5a\x22\x6e\xb7\xd8\x45\x09\x47\x50\x94\x49\x64\xe8\x89\x44\x8a\xcb\x33\xb2\xe9\xc4\x74\x0f\x32\xbd\xa1\xe8\x7e\x3b\x8f\x8b\x22\x7f\xcc\x69\x62\xdb\xd2\x16\x27\x8a\xfd\xe2\xb8\x11\xc5\xa5\x5f\x45\x8e\xd6\xc0\x41\xe4\x34\x0d\xdc\xa1\xdc\x2b\xed\x9c\x9a\x1c\xd7\xf5\x15\xa5\xc2\xe7\x18\xe5\x3a\x69\x18\x41\x47\x68\xef\x79\xe4\xae\x34\x02\xe4\x4f\xfb\xdf\x29\xa4\xfa\xc0\x05\x83\xb3\x05\xcf\xb4\xbd\x4b\x39\x52\x8f\x42\x02\x0c\xf8\x50\xfd\xb7\xfd\x66\x07\xb8\xd7\xe5\xc7\x12\x24\x54\x82\xe8\x76\xe2\x10\x61\x2f\x55\x88\x75\x24\xcd\x69\xae\x05\x7c\x27\x24\xb7\xc7\x65\xa8\x9e\xd0\x61\xa0\x8e\xcc\x06\x75\x0d\x0d\x1c\x31\xdf\x1a\xfc\xd4\x7c\xd4\x16\xf1\x74\x30\xae\xf1\x6b\x45\x4f\x30\x30\x69\x58\xdb\xe3\x9e\x70\xdf\xaa\xe7\xd1\x3e\x5c\x03\x6d\xaa\xf3\x35\x46\x4f\x22\x21\x63\x5f\x40\xf1\xd6\x6d\xa9\x94\xc1\x89\xa7\x9f\x3c\x26\xc9\xf0\x57\x12\xe7\xc2\xeb\x8e\x3b\x33\xd4\xa6\xcf\xfb\x5a\x82\xb9\x16\xde\xfb\x83\x1d\xb9\x36\x1f\x35\x02\x92\x15\xdf\x99\xdb\x92\xdc\x33\xd2\x2e\x5e\x7b\x02\xa3\x3d\x55\xf1\x28\x66\x35\x57\xb5\xd8\x33\x54\xdb\x84\x90\xb7\x88\x49\x08\x63\x03\x61\xec\x40\xf4\x0f\x57\xb7\xb1\xad\x02\xeb\xbf\x06\x89\xfe\xc1\x1b\x64\xcc\xe0\x5e\x00\xf7\xb8\x0b\x02\x22\x8c\x54\x7e\xa3\xf6\xdc\x96\x7e\xe2\xf0\xfe\x84\x50\x72\xd7\x52\xc4\x65\x8d\x26\xb5\xc2\xf7\xfa\x42\x18\xff\x9e\x8d\x51\x40\x57\xb5\xc9\x9b\xbc\xa1\xf9\xda\xec\x9f\x46\x9d\x5e\xaa\xac\x16\x4a\x4d\x49\x5e\x40\xd3\xc2\xea\xb9\x9f\x26\x85\x59\xf2\xae\x9b\x00\xb1\xc1\xcb\x6e\x36\x8c\x81\x5a\x00\x4c\xce\xe5\x7e\x2e\x92\x13\x37\x3d\xe7\x55\x20\x86\x01\xb0\xe5\x6a\x16\x1c\x88\xa9\x93\x8b\x95\xc9\x28\x23\x37\x7b\xcf\x36\xdb\x05\x9e\x7b\x87\x13\xa7\xd7\xe1\xb9\x49\x64\xd7\x6a\x93\x03\xf7\x48\x87\x72\xc4\x4b\x76\xc7\x7b\xda\xf3\x8c\xa6\x82\x91\x4c\x8c\xaf\x19\xae\xb8\xdc\x6b\x8f\xa7\xe6\xfa\xc4\x03\xb4\xc2\xf7\x63\xbc\x84\xa3\xe0\xb0\xe4\xf4\x7a\xea\x7c\xee\xd1\x1e\x5b\x7e\x3b\xd7\x77\x85\x4c\x9b\x79\x4e\x57\x98\xe8\x1c\x37\xf6\x06\x91\x69\x33\x3f\xd5\x6f\xdb\xed\x77\x02\xc6\xa5\xd9\x07\x2b\xb3\x83\xfa\xd7\x15\x8f\x38\xf4\xa1\x8f\x23\x12\xc4\x57\x49\xda\x1c\x37\x5c\xd0\x25\x37\xe7\x28\x1e\x73\x06\xa7\x6f\xe2\xc7\x59\x22\x63\x79\xf9\x49\x1b\x35\xce\xab\x2b\x97\xfe\x61\x63\x5e\xc2\x10\x7d\x47\xa1\xee\xc1\xa5\xb8\xb1\xcf\x82\xfb\xf7\x8c\x3d\xe6\xb6\xb2\x3e\x18\x87\x5d\x43\x4f\x62\xda\x25\xf5\x2e\x9b\x7c\xc6\x26\x42\x52\x9b\xb4\x8e\x6d\xc8\x59\x73\x54\xc8\xb1\xaf\xd8\x26\x96\xa2\x5d\xb9\x59\x3f\x38\x42\xcf\x96\x20\x4c\x84\xd7\x79\xa5\x0f\xe8\x04\x6a\xf1\xc4\x7c\x6c\xd3\xd9\x44\x90\xf6\x5e\x28\x58\x52\x45\xc2\x39\x16\x18\xc9\x15\x50\x71\xad\x28\x00\xd9\xda\x2b\xfb\x35\x30\xcc\xb8\x5e\x57\x61\x94\xda\xc8\x20\x18\x44\x4e\x8e\x12\x5a\xaa\x1f\x89\xe6\xd7\xbb\x6a\xca\xbe\x2a\x7e\xdc\x99\x5f\xc5\x44\xa8\x25\xa9\xb5\xf7\xc2\xe5\x1c\x41\x82\x22\x6d\xf3\xcb\x70\xa5\x6e\x98\xcc\x0a\x02\xb7\xfa\x54\x6a\x66\x6f\x04\x68\x93\xa0\x32\x54\xe0\x5b\x7d\x31\xe7\x74\x7a\x81\x7c\x1b\x8a\x77\x54\x77\x41\x75\x8e\xfd\x94\x6b\xad\xe5\xdf\x67\x94\x25\x76\x0e\xef\x28\xcb\x60\x3a\xbd\x70\x6b\xee\x23\x44\x64\x07\x98\x07\xe7\x79\x67\xb0\x77\x10\x54\xda\xce\xa6\x92\xa0\x57\x16\x5d\x4e\x6c\xf0\x98\x79\x4c\x0c\x59\x94\x15\x3c\x96\xaf\x28\xa1\x14\x25\x27\x79\xa7\xd6\x8e\xb9\xa5\xd1\xa4\xb1\x54\x67\x6f\xdd\x65\x8f\xd8\x8b\x6e\xb3\x91\x84\x1a\x16\xb9\x85\x14\x02\xdf\xe0\x24\xbe\x7d\x02\x9b\xc1\x5f\xd0\xd1\xa6\x33\xf2\x36\x84\x50\x65\x15\xd8\x7c\x28\xbf\xd3\x9e\x35\x4b\xfd\xed\x2f\x87\xa9\x9e\xa5\xb4\x38\xb4\xfd\x09\x7e\x87\x5d\x98\x78\xba\x5f\xa7\x43\xbd\x27\x18\x7b\x57\x99\x04\x33\x84\x52\x3a\xba\xc4\xd8\x2f\xef\x5d\x54\xdc\xa6\xb4\x4c\x7c\x9c\xb1\xa6\x04\x25\xae\xe3\x8b\x8f\x6d\x09\xff\xff\x89\x9c\x97\x29\x2d\x2e\x42\xec\xe3\x0f\xc7\xd3\xcb\x13\xca\x40\x0a\x9b\x0e\x9b\x6e\x6e\x9e\xde\x61\x5e\x8f\xbd\x72\xe3\xcc\x9e\xd1\x1e\x6f\x44\x27\x41\xe2\x41\xa2\x6e\x91\x57\x2d\xac\xb0\x65\x7e\x35\xbf\xa2\x9c\xf5\x3f\x23\x4d\x5a\x4a\x3c\xa4\xcc\xae\x8f\x66\xa7\x84\x85\x04\xe9\x3c\xd1\x2a\x5e\xc1\x92\xa1\x3d\x81\x1f\x18\x37\x42\xbd\xa6\x11\xc5\x2c\xb8\xe1\x13\xc5\x26\x96\xc3\xde\x0a\x52\x4b\x90\xef\x54\xe9\x99\x4e\xe8\xd9\xe6\x22\x34\x29\x76\x41\x98\x2f\x11\x9c\xf6\x56\x31\xf7\x4c\x41\x8c\x4f\x0c\x14\x0f\x64\xcc\x2b\x63\x77\x44\x29\xbf\x7f\x89\x76\x4b\xa2\x73\x73\x39\x53\x98\x3d\x3a\x61\x43\xfd\x86\x18\x43\xd7\xee\xbc\x1f\x3f\x9a\x1f\x7b\xf6\x14\x53\xb2\xac\x48\xa5\x77\x16\x41\x2d\x5f\xb0\xee\xbf\xd2\x86\x2d\xd7\x03\x59\x4b\xd6\xd9\x02\xe8\x56\xaa\xa8\x5a\xf0\x89\xbe\x5d\xda\x11\xc3\xa9\x35\xd8\xcf\xc0\xd6\x66\x5d\x7b\x89\x32\x06\xf2\x43\x90\x67\x2d\xa4\x9d\x4a\xa0\x67\x69\xef\xd2\xa2\x0d\x52\xdc\x1a\x48\x55\x41\x95\x1d\x50\x43\xe9\x83\xdf\xaf\x5e\xc6\x84\x7f\x83\x39\xc9\x4e\xc9\x12\xb8\xd0\x64\x92\x02\x07\x52\xc3\x68\x7c\x91\xbd\x35\x75\x86\xda\xb9\x7c\x3b\xea\xec\x04\x24\x63\xaa\x4f\xd1\xce\x39\x06\x72\x05\xb8\x5c\x75\x75\xb6\xb6\xfe\xac\xe1\xc0\x66\xf6\xde\xf5\x7e\x40\xef\x48\x99\xde\xe9\xa6\x72\x05\x48\xe8\xb9\xaa\xfb\x33\xd0\xd3\x00\x7e\x36\x7e\xdd\x29\xd4\xb1\xb8\x48\x00\x94\x91\x9f\x34\xb7\x8c\xba\xc6\x86\x6d\x06\xbe\x3d\x45\xa0\xfe\x4d\x04\x62\x98\x5a\xde\x51\x7f\x7d\xc2\x7f\x80\x4f\xfb\x1b\xee\xb1\xa2\x6b\x55\x63\xf2\xe9\xea\x22\xbd\x37\x6f\x18\x41\xff\xff\x85\x6f\x0f\x18\x58\x20\x22\x93\xba\x81\xed\x0e\x0e\x25\xbf\xa6\x04\xc2\x56\xdd\x1a\xb2\x0e\xf9\xcf\xef\xd7\x52\x14\xb5\xfb\x6d\xac\x46\x3a\x4f\xe3\xda\xe5\xbf\x69\x38\xe8\x6d\x33\xc2\x5c\xdb\x94\x05\x75\x27\x60\x5f\xa2\x79\x23\x4c\x32\x7a\x7a\x0b\x8c\x91\xdc\x4f\x25\xb9\x05\x07\xd9\xbd\xf0\x67\xd9\x44\x87\x85\x3a\x33\xa7\xc7\xa8\x1d\x8e\x51\x00\x33\x39\x44\x5b\xd9\x45\x7b\xda\x8a\xd4\xe8\xad\x88\xba\x83\x2e\x31\xd7\x5b\x69\xb8\x17\x0c\x67\x2a\xfa\x41\x7b\x52\x7d\x47\xaf\xa0\xaa\x8c\x39\xd9\xb4\x81\x86\x8f\x73\x49\xb7\x30\x7a\xdd\xd1\x98\x73\xf9\xee\x9a\xba\x1b\x32\x37\x91\x88\xf3\x72\xac\xbb\x31\x96\xdd\x70\x24\xf2\xfc\xd8\xfa\x52\x4e\x1d\xa9\xf0\x75\xe3\xd0\xd3\x48\xbf\xd8\xdc\x16\x9a\x1f\xb0\xe0\xa3\xac\xdf\x6f\xf0\x29\x78\x70\x72\xcf\xb8\xed\xc3\xe1\xb3\x3c\x91\x9c\xe6\x1b\x76\x79\xdb\xce\x3d\xa6\x9e\xdf\x99\x2d\x57\xa6\x1d\xa4\x76\x23\xe8\x0e\xe6\x5c\x5f\x64\xd8\x5e\x85\xc7\xb7\xf6\x3d\xf8\xcf\x27\x73\x7f\x9e\x47\x57\xff\xae\xbd\xe4\xb6\xce\x5b\x18\x6d\xe3\x66\x8b\x97\x3f\xc2\x03\xe2\x3f\xde\xcd\x8d\x6d\x53\xc9\x76\xce\xc2\xbb\x0e\x7c\x7a\x3d\xd2\x03\x33\xdc\x7e\xe2\x8e\xc1\xaf\xf3\x13\xfe\x73\x2c\x35\xa1\xf1\xf9\x65\xd8\xa2\x9f\xe0\x79\x70\xef\xbc\xe1\x1a\xa9\x81\x76\xdb\x5b\xcf\x64\x79\xdb\x6e\xea\xb2\xa7\xaf\xa3\x65\x5f\x0b\x43\x3d\xdb\x46\x6e\xf8\x70\xbd\x95\x61\x70\x35\x18\x04\xa2\x42\xfb\x0c\x10\x77\x7d\xda\x63\xea\xab\x8b\x09\xbd\xfa\x03\xee\xe3\x04\xa0\xa4\x5b\xfb\x11\x4e\xda\x1e\x57\x76\x12\x95\xbe\xb5\xd0\xdd\x45\x1a\x0d\xda\xd6\xb8\x87\x43\x9d\xbe\x1a\xd3\xb2\x6c\xf2\x7a\xcc\x0e\x6e\x2b\x22\xc8\x52\x2e\xc5\x67\xd7\xd7\x97\xf4\x7e\x8d\x3e\x37\x65\x05\x0c\xcf\x49\x49\xc4\x3a\x2a\x6c\x2d\x6b\x77\x77\x77\x13\x9d\x7c\x2f\xa3\xab\xbd\x79\x49\x97\x7b\x06\x0e\xa9\x96\x63\x51\xc0\x58\xdd\x98\x71\xbf\x1e\xdf\xfa\xd0\xc6\x77\x44\x14\x26\xd9\xdf\x70\x97\x75\x4c\x6b\xe7\xe9\x44\x52\x74\x6e\x3f\x17\x14\xd9\x3b\xd4\xf5\xaa\xdf\xb3\x31\xf5\xae\x42\x2f\xcb\xa1\x9c\x00\x49\xf4\xbe\x24\x6e\x48\x77\x38\x7e\x09\x6f\x4a\xf7\xda\xee\x97\x54\x46\xcc\x25\x72\x3e\x78\xd5\x63\xa5\xdc\x88\xcb\x36\x05\x04\x4f\xb3\x70\x95\x0f\xc0\x4d\x83\x9e\x42\x95\x6f\x80\xcb\x00\x3f\x1e\xee\x15\xe0\x10\x6e\x02\xb0\xd6\xfa\x87\x82\x32\x53\x3b\x14\xf5\xf7\x8d\xab\xda\x21\xbf\x0f\xbb\x77\xeb\xd3\xb7\xfb\xf1\x37\x15\x03\x70\x87\xa2\xda\x5e\x7f\x25\x64\x17\x89\xd4\x4b\x95\x14\x5c\x13\xd0\x10\xd1\x23\x01\x3e\x1d\xb1\xe0\x3f\x2a\x7a\x21\xc9\xb2\xf4\x86\xc0\x4c\xfb\x7a\x93\x35\x93\x2c\x2b\x2b\x69\x4f\x70\x8f\x17\xde\xc0\x55\x9b\xe7\xf4\xd3\x0b\x37\xcc\x68\x67\x9f\x1d\x74\x5e\xa9\x1b\xa5\x11\x5d\x20\x93\x57\x43\xb0\xb5\x12\xc8\x15\xdc\x0b\xef\x52\x22\xed\x17\x9a\xc3\x82\x32\x30\x7b\x74\xe5\x03\xab\x74\xbd\x04\xb6\x12\x80\x73\x7b\xf6\x61\xab\x84\xf4\x07\xb8\xf7\x6e\xe2\x8f\xf0\x0f\x3f\xb6\x11\xf1\x82\xad\x3f\xd0\xea\x3c\x87\x55\x4d\x85\x0d\x43\x4d\x79\xf9\xb4\xbf\x88\x56\xe5\x1a\xdd\x51\x76\xc3\xad\x1d\x30\xd3\xa1\x68\x88\x70\xb5\x95\xca\xe8\xaa\x66\xc0\x39\xe4\x7d\x9b\xd6\x44\x88\x5f\x9e\xbf\xc1\x1c\x12\xd6\xcd\x6d\xf5\xba\x63\x95\x3d\x64\xac\x52\x5c\x59\x0e\xde\xda\x08\xb4\xf7\x02\x1d\xe7\x39\xc2\xd5\xda\xcf\x0a\x11\x46\xd2\xeb\x33\xd8\xe9\x3e\x05\xfa\x6b\x5b\xc7\x0b\xf5\xdc\xb0\xed\xb4\xa3\x61\x3d\x11\xa9\x48\x52\xf4\x0d\x13\x1b\x5b\xbc\x7b\xda\xdd\xda\x88\xa5\x8d\xc1\x77\xfa\xae\x64\xb9\x0a\xb4\x5e\x5e\xed\x08\x10\x14\x61\xeb\x8b\xb4\xd6\x0f\xb3\x13\x7f\xa9\xea\xe5\x79\x78\x85\x87\x5d\x64\xfb\xfc\xbc\x05\xe6\x97\x0c\x16\xe4\x3e\x30\x23\x2a\x80\x68\xa4\x1b\x8a\x93\x99\x8c\x47\x9b\x6d\x20\xfa\x49\x64\xb8\xf9\x73\xec\x5f\xf9\x45\xd3\xda\xfc\x9b\xa4\xa4\xd9\x8a\x37\x7a\xcd\x53\x66\xb8\x52\x96\x14\x25\xc5\xf4\xe9\x20\x15\x28\xb5\x7d\x1c\x47\x8a\x57\x28\x43\xcf\x02\xeb\xbc\xb7\x8c\x5b\x5b\xa7\x0a\x5a\x1c\x19\x8e\x19\x3d\xdf\xb6\x02\x5d\x2c\x46\xdd\x28\x00\xbb\x9c\x86\x97\xb9\x76\x9f\x3e\xdd\x22\x68\xe3\x51\x1b\xdf\x6f\xd6\xe6\xc6\x72\xd7\x74\x4b\x0b\x7d\x0f\xbe\x3b\xe8\x03\x45\xe0\x12\xe8\xe1\x5b\x4c\x4a\xe5\x0a\xb5\x81\x1e\x46\x74\x04\x95\x8c\x2d\xbb\x33\x19\x1f\xd9\xb2\x0b\x6d\xcf\xa1\x22\x90\x4f\xd0\x15\x60\x4e\x4d\x5e\x14\xd7\xe9\x53\xf5\x31\xae\xbd\x3d\x0a\xc3\x27\xbc\x7a\xa2\xd5\x7b\x4e\xb4\x85\x07\x60\x74\x3a\x6c\xa4\x92\xba\xab\xa3\x5f\x59\x49\x9b\x5c\xb2\xc0\x2d\x51\x52\xd3\x06\x7a\x48\x3a\x36\x5a\x1b\x19\x3c\xcb\x9e\x0c\x8d\xb7\x85\xcf\x7e\x99\xe4\xdb\xc6\xb9\x1c\x1d\x6b\xd3\xe9\x50\xf4\x3d\xa2\x52\x70\xa8\x1c\xf5\x84\xa3\x39\xc8\x25\x65\x45\x2b\x22\x28\x83\xdc\x83\xa2\xd2\xa5\x48\xb5\xc9\x38\x34\x11\xa7\x0b\x71\x27\x17\xa2\x67\x25\xb9\x01\xc4\xd7\x3c\x27\xcb\xe7\xdd\xfe\x0d\x25\xfd\xd6\x66\xf7\x57\xdf\xfd\x65\xb2\x3f\xd9\x8f\x63\x6a\x07\x0e\xea\xea\x7a\x07\x07\xf1\xc5\x5a\xf6\xc9\x41\xea\x16\x65\x9c\x92\xed\x6b\x12\x72\x87\xac\xd3\x26\x9d\xb1\xff\xfe\x77\x00\x00\x00\xff\xff\x3a\xca\xc8\x4e\xd9\x9b\x00\x00") +var _etcNginxTemplateNginxTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x72\xdb\x38\xf2\xe0\xff\x79\x0a\x94\xec\xab\xd8\xa9\x48\x72\xb2\x99\xec\xac\x5d\xbe\x3b\xc7\x4e\xd6\xbe\x75\x12\x97\xe5\x64\xb6\x7e\x57\x57\x2a\x88\x6c\x89\x58\x53\x04\x07\x00\x6d\x6b\x72\xba\x67\xbf\xc2\x27\x41\x10\xa4\xe4\x4c\x26\x33\x3b\xb5\x9c\xaa\x8c\x85\x8f\x46\xa3\xd1\x68\x34\x1a\x8d\xc6\x97\x2f\x68\x17\xe7\x39\x3a\x3c\x46\x23\xb4\x5e\x3f\x91\xbf\x39\xb0\x3b\x60\x5c\xa5\x4d\xcc\xdf\x26\x2b\x99\x2f\x54\xf2\xe9\x7c\x61\x93\x2e\xf8\xc5\xd5\xe7\xd7\x6f\x0b\x3c\xcb\x21\x55\x99\xcd\x14\x53\x2c\x03\x9c\x8b\xec\x97\x4f\xd7\x17\xaa\xcc\x79\xfd\xd3\x14\x98\xe1\xe4\x16\x8a\x54\x37\xfb\xc6\xfe\x30\x99\x25\xa3\x0f\xab\x73\xc0\xa9\xc5\xeb\x4a\x26\x4c\x40\xd8\x34\x53\x0e\xa7\xa9\x5f\xea\xa4\xfe\xb9\x5e\x3f\x91\x25\xc8\x5c\x75\x62\xa4\xb1\x7b\x4f\x53\x0e\x49\xc5\x88\x58\xc9\x02\x39\xc5\xe9\x74\x49\xd3\x2a\x07\x34\x06\x91\x8c\x8b\x05\x29\x1e\xc6\x3a\x85\x8f\x8b\xc5\xc3\x34\x13\xa2\x94\x45\x6c\x35\x53\x7c\xc4\xe9\x91\x04\x0f\x45\x6a\x5b\x9a\x55\x24\x4f\x3f\x96\x50\x08\x86\x13\x52\x2c\x2e\x29\x4e\x35\x01\x65\x81\x14\xc3\x92\x16\x88\xce\xe7\x47\x4f\x9e\xdc\x53\x76\x0b\x6c\x5a\x32\x9a\x00\xe7\xc0\x91\x21\xf5\xe8\x27\x95\x71\xe5\xd2\xd7\xeb\x23\xd3\x89\x85\x40\x7b\x39\x14\x7e\xb1\xd3\xb2\x3a\x99\xcf\x49\x41\xc4\x6a\x1f\x1d\xc8\x56\x0c\xdc\xa4\xac\xa6\xd8\xe4\x04\xa0\xbd\x3a\x16\xb8\xed\x42\x49\x52\x34\x66\x55\xa1\x89\x30\x2a\x49\x6a\xdb\x2e\x00\x8d\xde\xe3\x07\xd9\xb7\x77\x24\x07\xde\x68\x8c\xe5\x64\x49\xc4\xb4\xa0\x73\x92\x83\x6c\xad\x59\x34\x68\xe4\xcb\x97\xf1\x33\x24\x69\x7a\x38\x36\xed\x50\xb6\x18\x43\x31\x4e\x69\xa2\x09\x9e\x50\x06\x96\xc8\x99\x58\xe6\x3b\xa6\x1d\x9e\x55\x22\xa5\xf7\xc5\x54\x90\x25\xd0\x4a\xa0\x67\x63\xc5\x03\xe3\x67\x08\xdf\x51\x92\xa2\x7b\x4c\x04\x29\x16\x48\x50\x8a\x72\x5a\x2c\x50\x5a\x31\xf9\x1b\x23\x06\x72\xa0\x75\x85\x2e\x68\x4d\x32\x4d\x4c\xf6\x8d\xc9\x5d\xaf\xd1\xd1\x93\x27\x70\x07\x85\xe0\xe8\xcb\x13\x84\x10\x5a\x56\xb9\x20\x53\x9c\x24\x50\x0a\x64\x3e\x5a\x1c\xa9\x3c\x3b\x0e\xb4\x28\x20\x11\x84\x16\x1c\xb9\x06\xde\xe3\x07\x33\x14\x5e\xae\xa4\x92\xac\x58\x71\x40\xe1\x07\x25\xcd\xf3\xa3\x27\xeb\x27\x4f\x24\xdd\x4c\xeb\x79\x85\xa7\x25\x4e\x6e\xf1\x02\xa6\x49\x89\x45\x86\x06\xe3\x8a\xb3\x71\x4e\x13\x9c\x8f\x73\x32\x1b\xe7\x15\x1e\xff\x0f\xc9\xa6\x3a\x9d\xcc\xc6\x0f\x3f\xbe\x9e\xbe\x7e\x35\xcc\x49\x51\x3d\x0c\x17\x45\xa5\x8a\xfc\x30\x7a\xa1\x8b\x1d\x0d\x8e\x5a\x90\x0d\xe0\x7a\x66\x68\xa0\x79\x85\x8f\x82\xc4\x3b\x28\x52\xca\x6c\x5e\x0c\x13\x99\x21\xdb\x70\x8d\xf0\x0c\x33\x48\xa7\x29\x49\x04\x4a\x68\x31\x27\x8b\x8a\x61\x49\x8e\x69\x8a\x05\x46\x3f\xbc\x3f\x8a\x16\x65\xb4\x2a\xd2\x29\xa3\x33\x52\x4c\xb9\xc0\x02\xd0\x8b\x8e\x92\x39\x4d\x6e\x39\xfa\xe1\xc5\xcb\x5b\xd3\xaa\x64\xfb\xe9\x6c\x35\x95\x05\x67\x32\xd7\x10\x53\x7e\x0c\x7e\xae\x08\x83\xbd\x01\x03\x2e\x56\x23\xc9\x85\x83\x7d\x97\x9b\xd0\x3c\x87\x44\x2c\x30\x9b\xe1\x05\xec\x0d\xcc\xef\xc1\xfe\x13\x57\x64\x38\x54\xf0\x91\x11\x1e\x2e\x5d\xd1\x01\xd1\xdb\xe7\x88\x01\xaf\x8b\x9b\x04\x74\x8c\xca\x04\xe7\xf9\x9e\x69\xff\x39\x1a\x34\x68\xe1\xe1\x20\x27\x22\x15\x88\xde\x22\x91\x41\xf1\xc4\x63\x10\xc6\x28\x93\x88\x2b\x08\x68\x8e\x49\x0e\xe9\x21\x1a\xa0\xd1\x08\x09\xca\x85\x9c\x05\x7b\x0c\xf8\x7e\x0d\x0b\x72\x0e\x1e\x84\x46\x93\xe8\x58\x61\xea\x8a\x16\xe9\x36\x58\xcf\x70\x8e\x8b\x04\xd8\xf7\x41\xd8\xb6\x16\xc1\x55\xfe\x7f\xed\x8d\xb7\x99\x8b\x1d\xc3\x6e\x01\x8d\xbc\xb2\x7b\xfb\x3e\x10\x25\x61\xee\x41\x4d\x4d\x91\x01\xba\xc3\x79\x05\x88\xce\xd5\x8f\x4c\x2d\x36\xe8\x9f\xc3\x77\x94\xdd\x63\x96\x42\x2a\xff\x42\x82\xa2\x19\x20\xb9\xe0\xc8\x3f\x6d\xcd\x05\xd0\x29\x29\x0d\x83\x68\x69\xa4\x1b\x70\x8b\xd4\x27\x0e\x6a\x9d\xbb\x62\x54\xd0\x84\xe6\xc8\x14\x61\x80\xf3\x29\x29\xa7\xa6\x39\xf5\xa9\x15\x52\x2e\x21\xaa\xe4\x91\x05\x25\x09\xd5\x57\xcd\x8a\x21\x87\xf0\x3b\xca\xf4\x92\xe9\x84\x90\x27\xae\x7d\x28\x4c\xae\x80\x9c\xdc\x81\x27\xe8\xbe\x7c\x41\x0c\x17\x0b\x40\xbb\x82\x55\x5c\x40\x2a\x3b\x78\x78\xac\x9b\x50\x5d\xb9\x06\x9c\x5f\x5c\x9d\x5e\x9c\x5d\x5b\xac\x38\x88\xa9\x85\x39\x67\x74\x69\xb1\xf2\x20\x74\x60\xa2\x86\x42\x0a\x87\x19\x96\x8b\x63\xc5\x21\x95\xf4\x4d\x41\x00\x5b\x92\x42\x53\x39\xa1\x55\x21\xd8\x0a\xa5\x50\x42\x91\xca\x05\x80\x16\x3a\x23\x27\x50\x08\x74\x71\x85\x70\x9a\x32\xe0\xdc\x1f\x82\xbe\x55\x49\x66\xd4\xba\xc0\x02\x28\x29\xfd\x05\x2a\x00\x23\x32\xc2\x11\xe1\x56\xa0\x48\x04\x13\x9c\x27\x55\x2e\x45\x95\x60\x72\x5d\x4e\xd0\x9c\x32\x44\x8a\x94\xdc\x91\xb4\xc2\xb9\xc3\xb9\xe2\x12\xdf\xbf\x03\xbd\xb8\x42\x44\x63\x2d\x45\x5c\xc5\x51\x89\x17\x1e\xcb\x68\x1c\x6c\x2d\xfd\x79\x02\x59\x65\x8f\x15\x98\x51\x8a\xc5\x91\x5f\x47\x2e\xfc\xee\x8b\xd5\xb9\x24\x02\x4e\x89\x58\x85\x35\x29\x5b\xa0\xfe\x9a\x17\x57\x27\x93\x0f\xd5\x32\xac\xa8\x19\xb5\xe6\x1e\xc9\x3b\x21\xe3\x6b\xed\xec\xb3\xe0\x13\xdd\x5d\xd3\xcf\xbb\x8c\x72\x31\x35\x44\x9b\x6a\x52\x4c\x7f\xa1\x05\x20\x2d\xe7\x0f\x63\x05\x0e\x2d\x8b\x3b\x70\xff\x45\x0b\x98\x90\x5f\xc0\xf1\x55\x14\xee\x9c\xe4\x42\x0b\x0a\xc9\xa1\xb7\x50\xab\x4e\x9f\x05\x3f\x83\x39\xae\x72\xf1\x4e\x95\xf9\x07\xac\xba\x58\x14\x13\x8a\xc2\x4f\x64\x0c\x70\xca\x8f\x6c\x81\xe9\x3d\x23\xc2\x5f\xe7\x1d\x45\x44\x52\x4e\x0b\x5a\x56\x3c\x6b\x66\xd6\x79\x29\xe4\x78\xd5\xae\x98\xd3\xc5\x94\x57\x33\xc9\x73\xc0\x45\x90\xc9\x40\x76\x48\x2a\x3a\x29\xad\x84\xa7\x95\xd4\x45\x6e\x01\x4a\x9c\x93\x3b\x70\xfa\x90\xeb\xfc\x3f\x00\xca\x13\x99\x85\xd6\x6b\xd3\x87\xba\xb4\x69\x90\xb7\x4b\x5f\xdb\x1c\x49\x28\x55\x4b\xcf\x3f\x23\x8c\xa6\xb3\x6a\x3e\x97\x7a\x98\x1c\x96\xa6\x64\x3a\x55\xe5\xb4\x4c\x7a\xa3\x4a\x35\xc6\xae\x09\xc6\xa1\xeb\xbe\x18\x98\x5a\x8d\x33\x3d\xc8\x31\x93\x8a\x53\x04\x23\xde\x00\x72\x29\xcb\xb5\x11\xe2\x21\x36\x33\x9a\xae\x22\x5d\x0a\xb1\x79\x43\xd3\x55\x77\x97\x14\x90\x76\x87\x62\x40\x1a\x1d\x52\x30\xa4\x6c\x7a\x39\x5d\xe2\x87\xe9\x9c\x40\x9e\x36\xb1\xf0\x60\x9c\xdf\xdc\x5c\xbd\x7c\x8f\x1f\xde\xc9\x52\x0d\x2c\x6a\x08\x86\x20\x01\x88\x10\x82\x26\x88\x03\xa1\x99\x74\x55\x02\x9f\x66\x98\x67\x0a\x50\x88\x04\x7a\x79\xf0\xea\xc7\x23\xb3\x0a\xc8\x7d\xe6\xb4\xc0\xcb\x78\x05\xdb\x9a\xde\x8f\x7e\xc0\x4b\x38\xc7\x3c\x7b\x8f\x1f\x1a\x38\xb7\xa1\xcc\xaa\xe4\x16\x84\x05\x14\x87\xf2\x46\x95\x69\x00\x5a\xe2\x32\x56\xbf\xd5\xf9\xf7\xb8\x8c\x40\x50\x20\xb4\x9c\xd3\xb4\x8b\x75\xc9\x82\xb8\xf2\xb6\xb6\xb1\x3e\x45\xe0\x34\x90\xea\x82\x13\xc3\xe9\x0e\x33\x22\x25\x6b\x94\x38\x1e\x4e\x9f\x6d\xb9\x0e\xf2\x04\x70\x5a\x63\x1b\x85\xe3\x77\x4c\xef\x6e\x0a\x89\xab\x54\xad\xf9\x94\x14\xb6\x8b\x0d\x22\x37\x17\x84\x4f\x75\x85\x8b\xa2\xde\xd8\xd3\xa2\x56\x74\xe8\x7c\xee\x44\xb0\xc6\x95\x2c\x0a\xb9\x85\x24\xc5\x1d\xce\x49\xda\xdb\xca\x85\x2a\x7a\xa1\x4b\x6e\x03\x5f\x0b\x0f\xb5\xe1\x65\xf0\xb3\x59\x39\x50\xf0\x39\xe1\x21\xcb\x5d\xc3\xcf\x7a\x11\x3a\xa5\xa9\x47\x8a\x56\x57\x3d\xc3\x81\x5d\xfd\xa8\x97\xe4\x29\x5c\x66\xb9\x91\xbf\x6c\x52\x68\x7a\xa8\xcd\x0e\x8a\x20\x45\x92\x57\x69\xd3\xc2\x41\x96\x30\x52\x93\x55\x83\x4d\xf5\xf2\x36\x95\x49\x48\xc0\x83\x18\x4b\xcd\xa6\x0b\xd7\x37\x8c\x8a\x9c\x58\x24\x66\xfa\x97\xc5\x50\xff\x9c\x26\x74\x59\x4e\x73\xb8\x83\xdc\xd1\x43\x57\xbb\x54\x69\x76\xb0\x4c\x69\x85\x4a\x50\xf0\x46\xa5\x75\xaa\x82\xbe\xd2\xfc\xf7\x5f\x94\xd2\xa8\x95\x0e\xf9\xb7\x45\x46\xfe\xf0\x51\xf9\xc1\x4b\x56\xda\xdc\x1d\x30\x2e\x57\xc2\x17\xa3\x17\x5e\xd6\x92\x14\xd3\x1c\x8a\x85\xc8\xd0\xcb\x1f\x5e\x7b\x19\x4d\x3c\x65\xb3\x4d\x2c\x55\x21\x39\x81\x09\xa4\x08\x17\x2b\x2f\xf5\x0e\xb3\x55\x64\x18\xd5\xcf\x1d\x74\x5a\x71\x41\x97\xc8\x32\xab\xd4\x0f\x19\xf0\x92\x16\x66\xdb\x53\x2b\xda\xb7\xcf\xd1\xee\x9d\xd2\xb1\x71\xc3\xd8\x25\x4b\xe1\xd4\xf2\xbb\xc2\xf1\x16\xad\xd7\x3e\x63\x0e\x64\xe2\x1d\x5a\xaf\x07\x51\x2c\x8c\x30\x15\xf4\x16\x0a\xee\x53\x78\x92\xd1\x7b\x2d\x41\x6f\x74\xde\xa6\x29\x68\xcc\x46\x54\x74\xd6\xd7\x42\x57\xce\x53\xa9\x9b\xd8\x6e\x0f\x74\xa9\x43\x14\x47\x70\x07\xa5\x84\xab\x5d\xd5\x3d\x66\x05\x29\x16\xdc\x88\x15\xb9\x79\x23\x38\x27\xbf\x40\x3a\xb5\xa2\x6a\x2a\xcb\x18\x7b\x9b\xae\x7c\x92\xa6\x44\xaa\x3d\x38\x47\xf8\x0e\x93\x5c\x41\x72\x92\xed\xd0\x94\xda\x55\x8b\x49\x89\x13\xb0\x09\xa4\x58\xc8\xed\x82\x5a\x65\x6c\x9a\xa4\x15\x49\xa0\x4e\x93\x1a\xd8\x9c\xb2\x25\x16\xa8\x2a\xb9\x60\x80\x97\xa4\x98\x53\x9f\x8c\x97\x74\xf1\x4e\x95\x78\xcb\x13\x5c\xc2\xff\x9a\x7c\xfc\x80\xd6\x6b\x50\x3f\x8e\xff\xc5\x69\x51\xf7\xf7\xa9\x9d\xd4\xae\xce\x27\x03\xd4\x4e\xed\xa7\x47\xde\x9e\x68\x89\x4b\x54\xb1\x9c\x23\x91\x61\x81\x78\x46\xab\x3c\x55\xe4\xc7\x65\x09\x58\x6e\x35\x10\x4e\x12\xe0\x7c\x94\xd3\xc5\xd7\x6d\x7b\x64\xff\x7c\xab\x9c\x86\x37\x6d\xc0\x93\x68\xec\x1a\x95\x70\x5a\x31\x82\x76\x73\xba\x58\x28\x32\xd7\x3b\xee\x9a\x93\x19\xfc\xfc\x89\x11\xb7\x5d\x9c\xdc\x92\xf2\x44\x41\xbd\xa4\x8b\x4f\xd7\x97\x8e\x4d\xac\x4c\x35\xe5\xd7\x6b\x74\x70\xd4\x94\x83\x9e\x08\x43\x66\x1e\xb7\xe5\xc4\x99\xe6\x1d\xd7\x84\x9b\x34\x75\x4f\x14\xb7\xa0\xf6\x46\xba\x25\x01\x27\x2b\x9e\x47\x21\x70\x95\x71\xa8\xa7\xd2\xb1\x53\x3f\x54\xea\x39\xe5\x52\x63\x3b\x6c\xa6\x5e\x51\xa6\xec\x8b\x0d\xae\x21\xf3\x63\x47\xbb\x28\x46\x5e\x93\x16\x9c\xeb\xd8\x15\x16\xd9\x96\x10\x6b\x12\x76\xcb\xd7\x58\x8f\x95\x05\xe7\x57\x76\xd8\xa6\xbe\x95\xb0\x2e\xe9\xa2\xb9\x30\x04\xfd\xad\x1b\x6c\xd5\xb3\xdd\xdd\x0c\xaf\xd9\x3f\x35\xbf\xae\x81\xd3\x5c\x1d\x78\xa8\xba\xf6\x67\x83\x63\x2e\xca\xbb\xd7\x67\x1f\x26\x4d\x33\xc4\x4f\x19\x14\x20\x4b\xaa\x89\x83\xb4\xcc\xe7\xca\xd8\xac\xf7\x60\xf7\x44\x64\x52\x45\xc7\x68\x50\x5b\x7a\x07\x46\xc2\x3f\x57\x7b\xfb\x48\x06\x22\x1c\x71\x10\x48\x50\x34\x48\x72\xca\x61\x10\x4c\xd7\xfb\x0c\x0a\xb4\xc4\xb7\xca\xd2\x9d\x01\x12\x72\x87\x22\x6c\xab\x23\x84\x6e\x32\xc2\xd1\x12\x70\x61\xa4\xc1\x8a\x56\x28\xc1\x85\x94\x06\x9c\x2c\xcb\x7c\xa5\xec\x51\x4d\xa0\x03\xad\x73\xd6\xa2\x18\xd5\x98\xa1\x5d\x35\xff\x13\x0f\x55\xb9\x3a\xfd\x04\xb3\x09\x95\x7a\x22\xe2\x55\x59\xca\x21\x9d\x41\x82\x25\x68\x65\xb8\x20\x1c\x25\x98\x83\xee\x67\xd0\x58\xa4\xd7\xf7\x4a\x62\xcd\xc0\xf5\x7d\xa0\x3a\xaa\x08\x2c\x21\x50\x46\x16\x44\x0a\x6e\x4b\xdd\x94\x68\x01\x97\xe1\x3b\xe8\x22\x71\x48\x38\x92\x64\xa6\x21\x49\x1e\x54\xd0\x7e\x54\x8c\x01\xa6\x45\xe0\x09\x29\x12\xd0\x5d\xd4\x65\x53\xb8\x23\x58\x00\x52\xc6\xac\x66\xa3\x85\x94\xdd\xb9\xe1\x91\x19\x64\xf8\x8e\x50\x86\xee\x41\xe3\xed\x6c\x83\x84\x4b\x49\xcd\x28\x4e\xb2\x51\x0d\x61\x07\x5d\x83\xc0\x06\x0d\x2b\xde\x34\xa8\x0c\x17\x69\xae\xf4\xc2\x39\x72\x7b\xf0\x5e\x8e\xab\x05\xb4\x1a\xce\xaa\x5c\x30\x9c\x02\xda\xad\xc7\xd5\xa5\x7d\x69\xc9\x54\xf7\x99\x22\x47\xae\xc4\xd3\xa7\x81\xf2\xab\x98\xb6\x21\x82\x65\xa3\x76\xba\xf9\x56\xc7\x1e\x3b\x24\xda\x15\x19\x58\x23\xa1\xc1\x67\x0b\x33\xa9\x26\xda\xdf\xa1\x61\xe4\x53\xa3\xa2\x8a\x23\x5b\xbe\xbb\x7f\xbb\x4d\xab\xea\x54\x02\x89\xca\xa3\x78\x6d\x06\x4b\x2a\x20\xa8\x55\xcb\x58\xa7\xc6\x28\x53\xa7\x5a\x79\xa7\x0f\x52\x6b\xd0\x14\xd0\xcd\x3a\x1d\x30\xa1\x8c\x41\x22\xf2\x95\xb2\x14\x26\x92\xc3\x38\xcf\xe5\x1a\x95\x53\x9c\x92\x62\x11\x0c\x69\x1b\xd2\x6e\x89\x39\x9f\x9a\xa5\x82\x27\x19\x2c\x7b\x07\xb7\x03\x4c\xcf\x60\xef\x6a\xa0\x47\xcd\xde\xa9\xdd\x94\x44\x37\xd6\x3e\x2e\x52\x5b\x0d\x61\x06\x8a\x08\x72\x22\xcc\x29\x4b\x40\x89\xcf\x94\xc8\x6e\xbb\xce\x0d\x4c\xe9\xc3\x08\xb4\x81\x24\xb9\x2e\x3f\x15\x54\x29\x2a\xbc\xaf\x87\x07\x75\x5f\x06\x4a\xef\x91\xff\x0c\x74\xc2\x8b\x20\x8f\x7b\x99\x2f\x5a\x0c\x1d\xa1\x95\x94\x81\x1a\x47\xa3\x48\xab\x94\x1e\x6c\x3a\x80\xf4\xd0\xdb\x1e\xd5\x7b\xe5\x9a\xeb\x35\xce\xf3\xd1\x05\x9f\x4c\x2e\xaf\x30\xe7\x22\x63\xb4\x5a\x64\xde\xb9\xbc\x1e\x1f\x89\xbf\xc6\x4d\xfb\x02\x8c\x2e\x09\x17\x50\xc8\x75\x99\x8f\x64\x5d\x35\x59\xd6\x6b\x39\x2c\xaf\x5e\xfd\x45\x89\xfb\xc8\x41\x87\x2c\x5f\xd3\xa3\xd5\x71\x9d\x12\xd0\x60\x53\x8b\x8d\xef\xd5\xab\xbf\x1c\xf5\x4d\xd5\xa0\x45\x4b\x0f\xd4\x9e\xad\xbf\x12\xc3\xf3\x9b\x9b\xab\xc9\xb7\x46\xaf\xb1\xaf\xf9\x38\x53\x82\x7e\x06\x46\x2c\xa0\x8c\x72\x11\x30\x9b\x4c\x92\x82\x91\x70\xfd\xe7\xc6\x99\x2c\x4b\xf5\x4d\xde\x3a\xbf\x97\xb1\x75\xbb\x12\xb5\x69\x8d\xc7\xa3\xc4\xc8\x26\x44\x5c\x9f\xba\x54\xf7\x53\xba\x2c\x2b\x01\xef\xaa\x3c\x6f\xac\x20\x8e\xa5\x7f\x02\xa9\xe3\x3c\x15\x6a\x3d\x35\x42\x5c\x6e\x86\x7d\x2c\x24\x1b\x5b\x1d\x45\xae\xa8\x72\x79\x71\xc7\x71\x06\x0e\x83\x32\xc7\x09\x70\x53\xc0\x49\x73\xe5\x54\xc0\x29\x2d\x7a\xe8\x24\xe1\xef\xce\xab\x3c\x6f\xa5\x36\xb8\xcb\x4e\xd3\xd3\x0d\x0b\x59\x8b\xae\x83\x68\x93\xcf\xa3\x6b\xd6\xa0\x87\xdc\x83\x0d\x15\xb6\x59\xe9\x3a\x71\xd1\x44\x9d\x7a\xa4\xeb\x47\xa5\xb7\xbc\x9e\x26\x6e\xf1\x44\x9d\x26\x0b\xb9\x0b\x9f\x92\x62\x6a\x17\x83\x7a\x23\x27\x67\x5e\x23\xc7\x7c\xb5\x5d\x80\x81\x3a\x8e\xd1\x7b\x0b\xef\x73\x67\x23\x9c\xe7\x8e\x56\xb5\xed\x47\x4b\x2d\x93\xe8\xcc\x7a\x3b\x48\x54\xac\x40\xb4\x40\x1c\xb8\x32\x2c\x25\x38\xc9\xb4\x57\x0a\x4a\x19\xe6\x82\x24\x38\x97\x4b\xfa\xb2\x64\xf4\x0e\x50\x09\x4c\x59\x0d\x8a\x04\x42\xa6\x9f\x4c\x2e\x27\x1a\xc8\x29\x4e\x32\x37\x1e\x12\x1d\x03\x7c\x9a\xa8\x0c\xa9\x59\x09\x52\x1c\xbe\x38\x38\x38\xb0\x07\x63\x93\xc9\xe5\xa1\x87\xaa\x0f\xa8\x69\x40\xf7\xa0\x85\xae\x30\x75\xbd\xfa\xb8\xa1\xc3\x2e\x83\xf3\x9c\xde\x3b\x37\x02\xd9\x5f\xa9\xaa\x58\x1a\x08\x22\x37\x0a\x3c\xd2\xa0\x4a\x8f\x77\xfa\xc6\x64\x6e\x34\xc7\xd6\xc6\xa6\x3d\x58\x96\x62\x15\x07\xf4\x0f\x58\xa1\xfd\x18\x0d\x35\x12\xea\xbc\xcf\x33\x90\x1a\xd4\x46\xb7\xb0\xea\xe8\x32\xcf\xc9\x22\x93\xda\x19\x83\xb4\x4a\xb4\x48\x91\x14\x1c\x0a\x3a\x9c\x13\xc6\xc5\x70\xb6\x12\xe0\x9a\xf3\x0f\x87\x3c\x02\x07\xa7\x41\xfd\x1d\x3a\x25\x65\x06\x8c\xef\xd7\x72\xaf\x4d\xf7\x44\x1b\x12\x25\xf9\x13\x5d\xdc\xa1\x60\x7e\xa3\xa7\x5e\xfb\x06\xa4\x36\x28\xd5\xdc\x0e\x0a\x57\x3d\xb9\x6c\xb5\x0e\xdb\x65\x27\xb6\x67\xe7\x57\x98\xe1\x65\x1b\x5b\x8d\xe1\xd9\x39\x52\x1e\x63\x5b\xda\x9f\x24\x5e\xbe\xfd\x49\xfe\x4e\xb3\x52\xb6\xe0\xf0\x36\xbf\x7d\xfa\x1a\x24\xfa\xcd\xc8\xce\x50\xa9\x55\xa5\xb3\x55\x81\x97\x24\xb9\xb9\x9c\x5c\x43\x42\x59\xca\x7d\xb6\x49\x57\x52\x98\x24\x6a\x20\xa7\x39\xb5\x2a\x65\x28\x97\x78\x3e\x85\x24\xcd\xa6\x49\xc5\xee\x1a\x03\xfe\xf6\xf4\xec\xfc\x54\x25\x06\xe3\x3d\xd2\x26\x60\x65\xbd\xe0\x35\xcd\x8c\x61\x58\xd9\x3f\x94\x17\x80\x1e\x4f\x2d\xc2\x49\x21\x80\x25\x50\x8a\x29\xe8\x6a\xdd\x63\x64\x6c\x6e\xc0\x98\x3a\x88\xb0\x46\x37\x0d\x5e\x2a\x38\xcd\x86\xb5\xbd\x45\x79\x1d\x48\xe4\x6d\xb5\xf5\x1a\x1d\xa3\xff\xa9\x47\x70\xda\xcc\x38\x0a\xda\x34\x26\x05\x6f\xa6\x31\x90\x4b\x6f\xec\xf8\xff\x44\x32\x86\x71\x01\xd5\x26\x60\xb7\x15\xf4\x60\x29\x8d\xca\x28\xa2\xba\xd4\x86\xce\x9a\xb2\xb6\xaf\xe7\x24\x85\xda\x60\x6e\x8e\xd9\x48\x0a\xbe\xc9\x3c\xeb\x75\x85\x89\xf3\xba\x52\x0f\x0b\x52\x96\x20\xf6\x5b\x03\x97\x48\xea\x70\x9d\xeb\x26\x2a\xa4\xd6\xba\xd0\xf4\xbc\xd2\xbf\x96\xb8\xb4\xad\x85\xf0\xbb\xad\x75\xa6\xcb\x72\x25\x7c\x8e\x76\xad\xe9\x4f\xf5\x7d\xe6\xf9\xd6\xd6\xbd\x80\x9f\xeb\x62\x23\x23\x2a\xad\x6b\xe8\xc8\xfe\x71\xb3\x2a\x01\x0d\x12\x4a\x6f\x09\x0c\x6c\x7d\x07\x5c\xae\x66\xb7\xab\xa1\xc4\xd3\x41\xfa\x80\x97\x8a\x4d\x6a\x9d\x47\x97\x42\x19\xe6\xd9\x71\xa3\x68\xd8\xe8\xa9\x6a\x26\x4c\x3d\xc7\x5c\x99\xf7\x64\xcf\xbe\xa6\xbe\x45\x48\x09\x1a\x5a\xe4\xab\xa3\x27\x81\x3a\xb6\xb7\x30\xd3\xdf\xda\xd8\xff\x61\xfd\x1b\x7c\x17\xcd\x83\x7d\x5f\x23\x72\x2e\x10\x6e\x94\x7a\x2b\x5b\x7e\x8a\x8c\x5d\x73\xfc\xb4\xcc\x55\xc3\xe6\xfa\xf9\xb6\x48\x4b\x4a\x0a\xb5\x16\x9a\xfc\xda\x6b\x7b\x74\x62\xec\x1c\xff\x17\xe9\xe3\x87\x8b\x2b\x6b\x72\x35\x05\xac\xbd\x55\xf9\x06\x60\x92\xf3\x63\x2f\xf3\x3d\x7e\x78\x27\xd3\x64\x01\x99\x69\x95\x00\xbf\x8c\x2c\x10\x6a\x00\x91\x8e\xd4\xbc\xe8\xa7\x3a\x66\xd9\xc0\x25\xf5\x81\x07\x4e\xdf\x28\xa7\x3c\x52\x2c\x4e\xd5\x7c\xf0\xd8\xd9\x9c\xa3\xd8\x22\x70\x92\x2f\x28\x23\x22\x5b\x86\xe4\xfc\xcf\xb0\x7e\x83\x61\xdd\x62\x54\xed\x1f\x53\xe7\x91\xe9\x4d\x7c\xdd\xa9\x83\x91\xfc\xef\xc5\x11\xda\x41\x6a\x73\x95\xd1\x3c\x05\x56\x53\xc9\xd6\xec\x72\xd1\xf4\x9c\x34\x95\xcf\x69\xed\x14\xea\x91\xba\x1e\x38\xa9\x05\x07\xfb\xc8\xf1\x33\xcd\x5b\x4a\xe2\x2e\x71\x69\x2c\xe3\xf7\x24\xcf\xd1\xcc\x78\x76\xd2\xda\x6c\x25\x4b\xfd\x94\x11\x01\x39\xe1\xa2\xe1\xa7\x69\x46\x93\x14\x29\x3c\x3c\x6f\x8c\x2a\xaf\xaf\x4d\x34\xcb\xe6\x34\xd1\xb2\xbd\x2e\x35\xba\x34\x69\x7e\xf1\x5d\xe5\x6b\x7d\x78\x6c\x67\x81\xa9\x55\xd7\x6f\xae\x41\x84\xdb\x22\x6a\xed\x84\xb4\x59\xb2\x2e\xe8\xee\x0d\xd8\xec\x91\xeb\xda\xe8\xf4\xe2\xec\xda\xdc\x1c\x30\x8b\xd6\x19\x14\x2b\x65\xef\xf9\xf2\x05\x95\x8c\x14\xc2\xe1\x7c\x4e\xb9\x90\x22\x18\x19\x4c\x6b\x4f\xc4\xc0\x58\x6b\xe6\xb1\x84\x64\xbd\x41\xd0\x5e\x07\xac\xc1\x74\x60\xe0\xed\x37\xa5\x81\x77\x98\x17\x99\x4d\xc6\xc7\xb4\xa3\x47\xe1\xb1\xa1\x72\x0d\x68\x1d\x19\x86\xeb\xe8\xf6\xbf\x82\x01\x66\xea\x2e\xcd\x9e\xf6\x1e\xbc\xc6\x02\x94\xdb\x07\xaf\x59\xc2\xd3\x09\x64\xb6\xf2\x1e\xd1\xe7\x99\xb9\x95\x83\x71\x52\xee\xde\xdb\x7e\x4d\x4d\xf1\x8b\xb3\x38\x99\x0e\x8e\xba\xa9\xc4\xf2\x9a\x3e\x71\xd2\xbc\x68\x91\x66\x1b\x74\x95\x11\xa4\x03\xc3\x5d\xed\x22\xd3\x81\xf5\x41\xd3\x43\x46\x0a\xd4\xff\xa2\x05\x38\x6e\xf1\x85\xd1\x0b\x34\x18\xf4\x58\xce\xbc\xb9\x8d\xf3\xdc\x58\x6d\x94\xdf\x6d\x8a\x98\x9c\xcb\x1a\xfd\x5f\x68\x01\x7c\x84\xde\xe2\x24\x43\xea\x28\x4c\x4f\x14\x53\x94\x23\x8c\x52\xd0\x26\xf6\x54\x95\x0d\x4e\x71\x5e\xbc\x7f\x83\x86\xff\x1d\xbd\x78\x8d\x44\x46\x2b\x8e\x8b\x14\xbd\x7e\xa5\xb6\x77\xca\x3d\x17\x38\xa2\x0c\xe1\x99\x14\xa4\x3f\xd6\x45\x5e\xbc\xfc\xb1\x51\x26\x22\x48\x54\x5b\x92\x7b\xf4\x59\xa4\x65\x1e\x49\x8d\x9a\x81\xf6\x7d\x29\xa1\x6a\x74\xb1\xe4\xf8\x19\x7a\xa3\x68\x61\x04\x93\x35\x7a\x70\xb4\x37\x67\x74\x39\x16\x14\xdd\xdf\xdf\xef\xc7\x30\xc9\xcc\x94\x7c\x8e\x76\x05\x55\x57\xa9\xae\x4d\xe5\x49\x53\xb2\xd9\x95\x2a\xc2\x70\xf6\xc4\x45\xf9\xa6\x18\x0b\xd7\x1b\x52\xa4\x66\x29\xbb\x28\xef\x5e\xf9\x0c\x98\x2b\x0b\x2b\x32\xb7\xb8\x54\x4d\xb3\xc2\xc5\xec\xaf\x68\xbd\xde\x6c\x3c\x0b\x9c\xe2\x03\xaf\x94\xde\x46\x37\x5b\xcf\x37\xd9\xae\xdb\x6d\x6b\x93\x45\x9f\x45\xf9\xeb\xbb\xe4\xfe\x90\x7b\xcd\x5e\xe3\x9d\xdf\xe5\xef\x41\xd8\x3f\x11\x25\x9b\x1e\x26\xa6\x89\xd6\x6d\xc7\xaf\x99\x09\xaf\xff\x33\x13\xbe\xf9\xf8\x6d\x33\x0b\xfe\xf7\xe1\xe1\xff\xf9\x4e\x94\xb5\x4d\xfd\x49\xe8\xd9\x9a\x0b\x41\x8a\x67\x8a\xd7\x96\x14\xab\xe4\x39\x3b\x57\x3d\x87\x0a\xe8\x42\xfc\xd5\xab\xbf\xb4\xdd\xbe\xcc\x09\xaf\x3a\xa9\x93\xab\xa5\xd2\x26\xe7\x68\x70\xf8\xdf\xee\x06\x1d\x80\x1a\xbb\x3a\x06\xca\x2a\x6f\xc9\x75\x6a\x6c\x2a\x76\x85\xb3\x96\x2d\x7b\xd0\x3c\x1e\xab\xeb\x48\xd4\x50\xb8\xd9\xfe\x7a\xed\x7b\xb8\xf5\xb2\xdc\xd7\x37\xdb\xdd\x44\xb7\x02\xfb\xa8\x3d\x8a\x56\xf0\x76\xa4\x6a\xc2\x04\x6a\xef\x3e\xcf\xeb\xc1\x8b\xaf\xfa\xe1\x68\xb7\xeb\x35\x36\xb3\x39\xc1\xad\xdd\xb2\x80\x65\xa9\x2e\x45\x0d\x26\x6f\xaf\x3f\xbf\xbd\x1e\x18\xa0\x76\xd3\x2f\x15\x3a\x8b\x7e\x7b\x77\xdf\x32\x38\xab\x82\xa1\x19\x0e\x7d\x23\x53\x1c\x6a\xdd\x25\x08\x0c\x72\x91\xb1\x68\x75\xf3\xf4\xd3\xe4\xe6\xe3\xfb\xe9\xdb\xeb\xeb\x8f\xd7\x13\xcd\xb8\xcd\xc1\xdc\xd9\x51\x00\xfa\x87\x23\x36\xec\x3b\x6e\x27\xa0\x2b\x3c\xd7\x77\xe3\xe4\x46\xee\xc3\xdf\x2f\x3e\xfc\x13\xe9\xcb\xf8\x49\x06\xc9\xad\xf2\xc0\xd0\x5e\x14\x72\xd7\xab\xfd\x89\xa4\x8a\xca\xe3\x23\xbd\x83\x3e\x99\x03\xd3\x6e\x9f\x01\x7b\x69\x0b\xed\x31\x5c\xa4\x74\x69\x2e\x49\xfe\xab\xe2\xca\x9b\x4b\xdf\xcf\xbe\x2d\xe8\x7d\xa1\x80\xf0\x7d\x84\xb9\x43\x59\x81\x95\xa8\xea\x23\x00\x7f\xdc\x32\x2c\xd3\x16\xda\x43\x4a\xc3\xf4\x74\xf6\x24\x53\xac\x4e\x8a\x43\xaf\x8e\x76\xdd\x18\x8f\x17\x44\x64\xd5\x6c\x94\xd0\xe5\xf8\xb6\x9a\x01\x2b\x40\x00\x1f\x1b\x57\xde\xa1\x3e\xe4\x99\xe5\x74\x36\x5e\x62\x2e\x80\x8d\x13\x5a\x08\x46\xf3\x1c\x18\x37\x47\x40\xe5\xed\x62\x9c\x2c\x53\x2f\xc7\x1c\x52\x2c\xe8\x36\xba\x55\x4d\x14\xeb\x5c\x5f\x8f\xab\x2f\x99\xaf\xa1\xe2\x60\x8c\x39\xca\x42\x2e\xe9\x51\xeb\x24\x33\x9c\xdc\xe6\x74\x71\x6c\x9b\x78\xa3\x7f\x37\x0e\xf1\x50\xb7\x72\xb2\x69\xd9\xfb\x3e\x58\xc6\x56\x0b\x61\x0f\xae\x9d\x09\x49\x9b\x04\x86\x03\x6f\xb9\x70\x36\x8d\x20\xa2\x44\x63\x3f\x89\x3a\x9c\x78\x03\x39\xfc\xf2\xc0\xdb\x26\xaf\x23\x6d\xe8\xe1\xb5\x97\x3a\x9a\xf0\xbb\xf1\x55\x67\x30\x05\xce\x7d\xb4\x51\xcc\x83\xb6\x75\xbb\xd1\x7e\xd1\xdb\x88\x29\xe1\x65\x8e\x57\x47\x5b\x97\xb4\xde\xe7\xfa\xe2\x46\x80\x49\xb8\x34\x6d\x22\x19\x17\xd5\xcc\x12\xc2\x9e\x29\xf9\xe0\x9a\x83\x19\x25\x66\x53\x9c\x36\xa9\x29\xa7\x94\xba\xf1\xd6\x65\xf1\x43\xe1\xa5\xf4\xd0\xf4\x87\x9c\xd0\xec\x44\x20\x00\xd8\x73\xca\x66\xbf\x96\x17\x2c\x42\xe8\x9f\x43\xb5\x4e\xbf\x3a\x78\xb5\x89\x0a\xa8\x97\x4d\xec\xcf\xa1\x99\x67\x43\x73\x2a\x33\x38\x8a\xa0\x50\x62\xee\xdd\x2a\x32\x27\xa4\x5d\x10\xa2\x4c\xbd\xfd\xc2\xb3\x7e\xf2\xc4\x5a\xe8\x9f\xa0\xe6\x45\x06\x75\xab\xb4\xb6\xde\x37\xee\x30\x4c\x74\x7a\xec\x42\xd3\xaf\x70\xb4\xdf\xc6\xad\xbd\xc6\x2a\x7a\x46\xb7\xd9\x53\xdc\xf9\x6a\xdc\x9c\x5e\x21\x73\x91\x83\x87\xea\xd3\x73\xb4\x2b\x92\x72\xe2\xb4\xa7\xd1\xcd\xe9\xd5\x9b\xe0\x20\xcd\x59\xc1\x45\x52\xaa\x53\x30\x57\xc3\x5a\xe7\x83\x54\x03\x40\xd9\xd1\xd4\x15\x93\xfe\x22\xdd\xb9\xce\x87\x3e\x40\xfb\x5f\xcf\xd1\x2e\x98\x73\x05\xa5\xf3\xd5\x55\xfd\xe3\x86\xd0\x44\xdf\xfa\xd4\xd1\xae\xa9\xe0\x8e\x22\xcc\x9e\xd4\xa5\x1b\x24\xe2\x9e\xae\xe8\xb7\xb0\x15\x45\xf1\x0c\xb6\xcc\xad\x31\x30\x9c\x19\x21\xa2\xbf\x21\x1a\x9d\x41\x62\x14\xf2\x8d\x1b\xbc\xee\xed\x65\x14\xc1\xef\x84\xd1\xf7\x35\x56\xfc\xfb\x0d\x85\xd3\x81\x7e\xaf\xf1\x08\x52\x34\x90\xee\x0b\xec\x3a\xe2\x95\x12\x30\xb1\x63\xba\xd8\x4a\x81\x74\x9c\x80\xdf\x45\x16\xb5\x54\xd1\x4d\xe4\x7c\x5b\x18\x72\x86\x5d\xb2\x26\x0a\xf7\xf9\x1a\xc8\x36\xa7\x93\x3b\xe8\xd3\x59\xaf\x64\xaf\x52\x5f\xb2\x7f\x3a\xeb\x96\xec\x55\xaa\xa9\xe9\x6a\x34\xa8\x59\xa7\x76\x52\x33\x5e\xa4\x3b\x77\x6b\xc9\x5e\x57\xfd\xce\x92\xfd\xf7\x13\xed\xad\x41\x90\xc3\xf3\xd5\x62\x79\x0b\x68\x7f\x3c\x91\xfa\xed\x48\xe0\xc4\xe1\xd7\xd0\x21\x2a\xca\xec\x85\x65\xde\xe8\x40\x20\xca\xae\x5d\xa1\xb6\x30\xfb\xe6\xb2\xf0\xf7\x9a\xbd\xa1\x1f\xbb\x21\x97\x8d\x7f\x97\x82\xf2\x4d\x52\x11\x58\xe6\x4e\x4f\xe7\xb5\xa9\x84\x41\x09\x82\x68\x17\x01\x13\xe6\x4e\x57\x6a\x2b\xf3\x81\xb1\xb4\x0c\xc2\x24\x76\x84\x4e\x6c\xb3\xac\xe7\x18\xa8\xd8\xb5\xcb\x31\x10\xf9\x7b\xac\xb8\x27\x60\xb0\xf1\xb2\x1b\xe4\x60\x7f\xdc\xe5\xc1\xe8\x1c\xb3\x9b\x05\x9b\xbb\xb2\x7a\x63\x86\x02\x6e\xf1\x1c\x12\xb7\x83\xa2\xb7\x33\x5e\x49\xed\xda\xae\x03\xfb\x6d\x09\xe3\xa3\xb9\x9e\x38\xfc\x74\x7d\xa1\x61\x44\x0d\xb8\xbd\x30\x6a\xde\xb3\x78\xb8\x8b\xe8\x5b\x42\xb8\x30\xc6\x2d\xc5\xa2\x0a\x82\x7f\x73\x7d\x4b\x20\x13\xbd\x6a\x7a\x40\xfc\xab\xee\xc1\xd0\x18\xdf\x79\x14\x7c\x7b\xa3\x67\xfb\x68\x8c\x66\x0c\xf0\xed\xe6\xed\xed\xe3\x76\xb8\xf6\xaf\x7a\x56\x85\xd1\x25\x4f\x3f\x5e\x4f\xdc\xa5\x54\x75\xfb\xcf\xda\x04\x97\x24\xc9\x08\xe4\xb7\x38\xbf\x5d\xe2\x42\xd9\x06\x8d\x39\xd8\xd8\xfc\x86\x09\x65\x7c\x48\x4b\x28\x86\x4d\xeb\x43\x1d\xe7\xcb\x9f\x89\x8d\x09\xa8\x44\x15\x35\x53\xee\x94\x32\x6e\xec\xd8\x36\x7f\x07\xc9\x44\x74\xc5\x60\xae\x3c\xc7\xd1\x12\x44\x46\x53\x8e\x0a\x80\x94\x23\x5c\x07\x27\xa0\xa5\x9e\xf9\xb8\x48\x51\x4a\xe6\x73\x60\x50\x08\x74\xad\xad\x58\x92\xb9\x35\x40\x32\x47\x7b\x8e\xcf\x34\x30\x74\x8c\x9e\x7e\xbc\xba\xb9\xf8\xf8\x61\xf2\x74\xdf\x9b\x86\xad\x40\x0b\x4f\xf5\xae\x7a\x78\xaa\x6d\x9b\x43\xe5\x44\x64\xd8\xf8\xd0\x75\x45\x75\x43\x65\xe9\x9c\xda\x4b\x1c\x79\x3b\xfe\x46\xc1\x53\x06\x29\x14\x82\x60\xed\x7b\xb6\x65\xc3\x5e\xad\x58\xeb\x4d\xa0\x4f\x8f\x22\x2b\xd0\x96\x0d\xbd\xd7\x34\x8f\x35\x62\xb2\x9a\x7d\xdc\x12\xac\x91\xac\x31\xb0\xb5\xd0\x7d\x0c\xd8\xf7\xf8\x61\x78\xb2\x80\x00\xe0\x7b\xfc\x70\xb2\x80\x4d\xa0\x4e\xb5\x71\x6d\x78\xb3\x2a\xe1\x50\x07\x73\x29\x73\x4c\x0a\x94\x64\x98\x71\x10\xc7\x9f\x6e\xde\x0d\x7f\xdc\x0a\xc4\xa5\x8a\x81\x72\x88\x0e\xbc\xd2\xce\x9a\x6a\x0d\x62\x9e\xd5\xe9\x3f\x7c\xf6\xc7\xe0\xb3\x96\x4c\x6c\x6a\x1c\x5a\x79\x1f\x3a\x03\x61\x54\xef\xb8\x27\x22\xb3\x25\xb1\x3a\xbf\x0b\xe5\x9f\x3d\xb6\x0b\x54\x10\x1b\x5d\xfa\x1d\x61\x6d\x8f\xb3\xfa\x38\x72\x34\x81\x84\xb6\x14\xcb\x3f\xbc\x2b\x51\xed\x3c\x1f\x71\x66\xfc\x6d\x8f\x51\xbe\x7c\x51\xb7\xe1\x7e\x37\x67\x9f\x3f\x5a\xd7\xa3\xbb\x33\xed\x69\xf1\x6f\xec\xa1\xf3\xbb\x52\xf9\x0f\xe1\x49\xf3\xc7\xa3\xc0\x66\xdf\x97\xad\x4e\x33\x95\x28\xd6\xa4\x42\xb4\xe3\xd4\xd8\x73\xfb\xb1\x97\x95\x3b\xcf\xdd\xdd\xbd\x74\x62\x82\xe1\x1a\x4f\x86\x9b\xcb\x09\xe2\x05\xb1\x46\x1a\xe7\xee\xe9\x70\x50\x31\x62\xf4\x38\x02\x43\xcb\x8a\x0b\x84\xf3\x7b\xbc\xe2\x3a\x2e\x49\x60\x87\x03\x3d\x91\x9e\x37\x6e\x4f\x4f\x3e\x5c\xd4\x10\xcc\x2d\x60\xae\x2e\xbe\xd2\x8a\x25\x80\x54\x04\xdb\x39\x95\x28\x11\x31\x0a\x71\x08\x3d\x38\xcc\x40\x4f\x26\x97\xa7\xc0\x04\x99\x2b\x5f\xdc\xfd\xdf\x76\x6d\xf8\xd6\x7e\x59\xe8\xfb\x39\x2a\xfe\xfe\x92\x58\x5d\x30\x6d\x77\x45\xc5\x06\x45\xeb\xb5\x8a\x25\xfa\x28\x71\xf2\x9f\x01\xf9\xdd\x06\xe4\x3b\xae\xa3\x8f\x98\xf9\x7f\x3e\xff\xd4\x3f\x09\xbb\x04\xf3\xf7\xf1\x43\xfa\x6f\xef\x18\xfb\x27\x19\xc8\x4d\x5a\x8d\x52\x15\x12\xba\x5c\x42\x21\xd0\xd5\xdb\xf7\x88\x67\xd8\x8b\x6c\xef\x62\xef\x27\xc2\xb8\xe2\x71\xab\x80\x2c\xa4\x56\xa0\x6e\xd3\x34\xbd\x80\x70\x91\x7a\x81\x9e\xea\x47\x59\x6c\x8b\x3b\xb6\x99\x43\xdf\xfb\x51\x8e\x38\x2c\x4f\x33\x48\x6e\x79\xb5\x6c\xe8\x5d\x3c\x9f\x26\x35\x8f\xa1\xae\xaf\x09\xcc\xe3\xca\x06\x4d\x02\x68\x2a\x24\xc4\xd7\x43\xeb\x9b\x17\xef\xaa\x3c\x3f\xcd\x30\x29\xfc\x09\x12\xf4\xcb\x3e\x87\xd0\xd7\xbf\x26\x26\x31\xa8\xad\x0e\x72\x81\x4b\x15\x39\xae\xe7\xf3\xcf\x5b\xfd\x3a\xd3\x3b\x60\x64\x1e\x27\x4a\xf7\x19\x2d\xea\x74\x8d\x8d\xd3\xe7\xa4\x12\xd9\xcd\xe5\x44\x1d\x3b\x04\x8e\xbc\xbe\x4b\xb1\x57\x2a\xe2\x74\xfd\xea\xe0\x2f\x51\xa9\xb5\xb9\x79\x8f\x78\xb2\x8d\xd1\xe9\xc9\x3b\x92\xc3\x07\xbc\x84\x00\x99\x18\xab\x86\x95\xaf\x60\x39\x39\x3f\x69\xb1\xac\x8e\xf7\xde\xcb\xb9\x3d\x40\x6b\x8c\x5a\xa3\xab\x07\xc8\x34\xd0\x31\xba\x3d\x90\x3f\xab\xea\x3a\xcc\x7c\x17\xec\x14\x4a\x91\x75\x80\xee\x85\xad\xaf\xd7\x12\x5a\x9c\x29\x08\x5b\xcd\x95\x10\x88\x1a\xee\x2b\xbc\x68\xcc\x16\x2f\x56\xc5\xab\xbf\xfd\x80\x5e\xfd\xed\x35\x3a\xee\xc3\xc4\x01\xd9\x5a\x22\x6e\xb7\xd8\x05\xd1\x59\x50\x10\x76\xa5\xef\x0b\x44\x8a\x0b\xca\xb2\xe9\x7a\x79\x07\x32\x9d\xbe\xf0\x7e\x3b\x8f\x73\x63\x7f\xcc\x75\x66\xdb\xd2\x16\x57\x9a\xfd\xe2\xb8\x12\xd9\x95\x5f\x45\x8e\x56\xcf\x4d\xe8\x38\x0d\xdc\xad\xe0\x6b\x7d\x38\x35\x3a\x29\xcb\x6b\x4a\x85\xcf\x31\xea\xe8\xa4\x62\x04\x1d\xa3\xf1\x7e\x70\x5c\x69\x04\xc8\x5f\x0e\x5e\x2a\xa4\xba\xc0\x35\x06\x67\x0b\x9e\xa9\x7b\x17\x3b\x48\x3d\x6e\x12\xa0\xe7\x0c\xd5\x4f\xed\x36\x3b\xc0\x83\x2e\x3f\x94\x20\xa1\x10\x44\xb7\x13\xfa\x28\x7b\x71\x55\xec\x41\xd2\x8c\xa6\x5a\xc0\xb7\x7c\x82\x3b\x8e\x0c\xd5\xd7\x3c\x30\x50\x77\x76\x1b\x75\x0d\x0d\x1c\x31\xdf\x1a\xfc\xd4\x7c\xd4\x16\xf1\xb8\x33\xae\x39\xd7\x0a\xbe\xc6\xc0\xc4\x61\x6d\x8f\x7b\xe4\xf8\x56\x7d\x8f\x3e\xc3\x35\xd0\x26\x3a\xb8\x65\xf0\x45\xa2\x57\x76\x39\x14\x6f\xdd\x96\x8a\xaf\x1c\xf9\xba\xc9\x63\x22\x32\x7f\x25\x71\x2e\xbd\xee\xb8\x4b\x4b\x75\xac\xc1\xaf\x25\x98\x6b\xe1\xbd\x3f\xd8\xc1\xd1\xe6\xa3\x46\x40\xb2\xe2\x3b\xf3\xb4\x94\xfb\x06\xfa\x88\xd7\x5e\x01\xa9\xaf\x75\x3c\x8a\x59\xcd\xbb\x36\xf6\x12\xd7\x36\x2e\xe4\x35\x62\x12\xc2\xd0\x40\x18\x3a\x10\xdd\xc3\xd5\x6e\x6c\x2b\xcf\xfe\xaf\x41\xa2\x7b\xf0\x7a\x19\xb3\xf1\x88\x82\xfb\xdc\x6b\x0a\x01\x46\x2a\x18\x54\x7d\x71\x4c\x7f\xe1\xfd\x82\x88\x50\x72\x6f\x78\x84\x65\x8d\x26\xb5\xc4\x0f\xfa\xf5\x1c\xff\x51\x92\x41\x83\xae\x6a\x93\x37\x7a\x43\xd3\x95\xd9\x3f\x0d\x5a\xbd\x54\x61\x35\x94\x9a\x12\x7d\xad\xa7\x86\xd5\xf1\x98\x4f\x0c\xb3\xe8\xc3\x40\x0d\xc4\x7a\x5f\x06\xda\x30\x06\x6a\x01\x30\x01\xaa\xbb\xb9\x48\x4e\xdc\xf8\x9c\x57\x8e\x18\x06\xc0\x96\xab\x59\xe3\x46\x4e\x19\x5d\xac\x4c\xf8\x1d\xb9\xd9\xdb\xdb\x6c\x17\xd8\xf7\x6e\x47\x4e\x6e\x9a\x17\x37\x91\x5d\xab\x4d\xc0\xe0\x63\xed\xca\x11\x2e\xd9\xad\xd3\xd3\x8e\x6f\x30\x11\x8c\x24\x62\x78\xc3\x70\xc1\xe5\x5e\x7b\x38\x31\xaf\xba\x1e\xa2\x25\x7e\x18\xe2\x05\x1c\x37\x6e\x6b\x4e\x6e\x26\xee\xcc\x3d\xd8\x63\xcb\xbc\x0b\xfd\xb0\xca\xa4\x9a\xa5\x74\x89\x89\x0e\x08\x64\x9f\x5b\x99\x54\xb3\x33\x9d\x5a\x6f\xbf\x23\x30\xae\xcc\x3e\x58\x99\x1d\xd4\x9f\xae\x78\xc0\xa1\xeb\x2e\x8e\x88\x10\x5f\x45\xb4\x73\xdc\x70\x49\x17\xdc\xdc\xa3\x78\xcc\x25\xa0\xae\x89\x1f\x86\xd4\x0c\xe5\xe5\x27\x6d\xd4\xb8\x28\xae\x5d\xfc\x89\x8d\x41\x1c\x9b\xe8\x3b\x0a\xb5\x6f\x4e\x85\x8d\x7d\x16\xdc\x7f\x94\xed\x31\x4f\xbb\x75\xc1\x38\x6a\x1b\x7a\x22\xd3\x2e\xaa\x77\xd9\xe8\x37\x36\x6a\x94\xda\xa4\xb5\x6c\x43\xce\x9a\xa3\x5c\x8e\x7d\xc5\x36\xb2\x14\xed\xca\xcd\xfa\xe1\x31\xda\x5b\x80\x30\x1e\x5e\x17\x85\xbe\xa0\xd3\x50\x8b\x47\x26\xb3\x8e\xa7\x13\x40\x1a\x3f\x53\xb0\xa4\x8a\x84\xd5\x0b\xab\x72\x05\x54\x5c\x2b\x32\x40\xb6\xf6\xd2\xe6\x36\x0c\x33\xae\xd7\x45\xd3\x4b\x6d\x60\x10\x6c\x78\x4e\x0e\x22\x5a\xaa\xef\x89\xe6\xd7\xbb\xae\xf2\xae\x2a\xbe\xdf\x99\x5f\xc5\x78\xa8\x45\xa9\x35\x7e\xe6\x82\x9e\x20\x41\x91\xb6\xf9\x25\xb8\x50\xcf\x71\x26\x19\x81\x3b\x7d\x2d\x36\xb1\xcf\x27\xd4\x11\x63\x19\xca\xf0\x9d\x7e\x2f\x78\x32\xb9\x44\xbe\x0d\xc5\xbb\x2b\x3c\xa7\xfa\x41\x82\xd8\xd1\x5a\xcd\xbf\x7b\x94\x45\x76\x0e\xef\x28\x4b\x60\x32\xb9\x74\x6b\xee\x23\x44\x64\x0b\x98\x07\x67\xbf\x35\xd8\x3b\x08\x0a\x6d\x67\x53\x11\xe3\x0b\x8b\x2e\x27\x29\xb4\x85\x6b\x2b\x84\x7a\x28\x5f\x51\x44\x29\x8a\x4e\xf2\x56\xad\x1d\xf3\xa4\xa5\x89\xf9\xa9\x2e\xff\xba\x97\x31\xb1\xe7\xdd\x66\x3d\x09\x35\x2c\x72\x07\x31\x04\xbe\x41\x28\x00\xfb\x35\x6c\x06\x7f\x45\xc7\x9b\x2e\xe9\x5b\x17\x42\x15\xd6\x60\x73\x54\x80\x56\x7b\xd6\x2c\xf5\xb7\xbf\x1e\xc5\x7a\x16\xd3\xe2\xd0\xf6\x21\x04\x1c\x76\xcd\x28\xdd\xdd\x3a\x1d\xea\xbc\xc1\xd8\xb9\xca\x44\x98\xa1\x29\xa5\x83\xb7\xd5\xfd\xf2\xde\xfb\xe9\x75\xfc\xcf\x48\xe6\x94\x55\x39\x28\x71\x1d\xbe\xc7\x6e\x4b\xf8\x7f\x8f\xe4\xbc\x8c\x69\x71\x01\x62\x1f\x7f\x3a\x99\x5c\x9d\x52\x06\x52\xd8\xb4\xd8\x74\x73\xf3\xf4\x1e\xf3\x72\xe8\x95\x1b\x26\xf6\x92\xf8\x70\x23\x3a\x11\x12\xf7\x12\x75\x8b\xc0\x6e\xcd\x0a\x5b\x06\x78\xf3\x2b\xca\x59\xff\x2b\xe2\xb4\xc5\xc4\x43\xcc\xec\xfa\x68\x76\x8a\x58\x48\x90\x0e\xaa\xad\xfc\x15\x2c\x19\xea\x10\x00\x0d\xe3\x46\x53\xaf\xa9\x44\x36\x6d\x3c\x87\x8a\x42\x13\xcb\x51\x67\x05\xa9\x25\xc8\x34\x55\x7a\xaa\xa3\x9f\xd6\x81\x1b\x4d\x3c\x62\x10\x26\x27\x80\x53\x3f\xc1\xe6\xbe\x09\x88\xe1\xa9\x81\xe2\x81\x0c\x79\x65\xe8\xae\x28\xa5\x0f\xcf\xd1\x6e\x4e\x74\x70\x30\x67\x0a\xb3\x57\x27\xac\xab\x5f\x1f\x63\xe8\xda\xad\xf4\xe1\xa3\xf9\xb1\x63\x4f\x31\x21\x8b\x82\x14\x7a\x67\xd1\xa8\xe5\x0b\xd6\x83\x17\xda\xb0\xe5\x7a\x20\x6b\xc9\x3a\x5b\x00\xdd\x4a\x15\x55\x0b\x3e\xd1\x4f\x71\x3b\x62\x38\xb5\x06\xfb\x21\xe0\xea\xb0\x6f\xcf\x51\xc2\x40\x66\x34\x02\xbd\x35\x69\xa7\x22\xf8\x59\xda\xbb\xb8\x6c\xbd\x14\xb7\x06\x52\x55\x50\x85\x27\xd4\x50\xba\xe0\x77\xab\x97\x21\xe1\xdf\x60\x4e\x92\x33\xb2\x00\x2e\x34\x99\xa4\xc0\x81\xd8\x30\x9a\xb3\xc8\xce\x9a\x3a\x9c\xef\x4c\xa6\x0e\x5a\x3b\x01\xc9\x98\x2a\x2b\xd8\x39\x87\x40\xae\x01\xe7\xcb\xb6\xce\x56\xd7\x9f\x56\x1c\x98\x96\xa2\xbd\x80\xde\x91\x3c\xbe\xd3\x8d\x05\x2b\x90\xd0\x53\x55\xf7\x57\xa0\xa7\x01\xfc\x6a\xfc\xda\x53\xa8\x65\x71\x91\x00\x28\x23\xbf\x68\x6e\x19\xb4\x8d\x0d\xdb\x0c\x7c\x7d\x8b\x40\xfd\x19\x71\xc4\x30\xb5\xbc\xab\xfe\xfa\x86\x7f\x0f\x9f\x76\x37\xdc\x61\x45\xd7\xaa\xc6\xe8\xd3\xf5\x65\x7c\x6f\x5e\x31\x82\xfe\xdf\x33\xdf\x1e\xd0\xb3\x40\x04\x26\x75\x03\xdb\x5d\x1c\x8a\xe6\xc6\x04\xc2\x56\xdd\xea\xb3\x0e\xf9\xdf\x1f\xd7\x52\x14\xb4\xfb\x6d\xac\x46\x3a\x50\xe4\xca\x05\xe0\xa9\x38\xe8\x6d\x33\xc2\x5c\xdb\x94\x05\x75\x37\x60\x9f\xa3\x59\x25\x4c\xe4\x7e\x7a\x07\x8c\x91\xd4\x8f\x65\xb9\x05\x07\xd9\xbd\xf0\x67\xd9\x44\x8b\x85\x5a\x33\xa7\xc3\xa8\xdd\x1c\xa3\x06\xcc\xe8\x10\x6d\x65\x17\xed\x68\x2b\x50\xa3\xb7\x22\xea\x0e\xba\xc2\x5c\x6f\xa5\xe1\x41\x30\x9c\x28\xef\x07\x7d\x92\xea\x1f\xf4\x0a\xaa\xca\x98\x9b\x4d\x1b\x68\xf8\xb8\x23\xe9\x1a\x46\xe7\x71\x34\xe6\x5c\xa6\xdd\x50\xf7\x9c\xe8\x26\x12\x71\x9e\x0f\x75\x37\x86\xb2\x1b\x8e\x44\xde\x39\xb6\x7e\xc1\x54\x7b\x2a\x7c\xdd\x38\x74\x34\xd2\x2d\x36\xb7\x85\xe6\x3b\x2c\xf8\x28\xeb\xf4\x0d\x67\x0a\x1e\x9c\xd4\x33\x6e\xfb\x70\xf8\x34\x8d\x44\xc7\xf9\x86\x5d\xde\xb6\x73\x8f\xa9\xe7\x77\x66\xcb\x95\x69\x07\xa9\xdd\x08\xba\x87\x19\xd7\xaf\x3e\xd6\xef\x06\xf2\xad\xcf\x1e\xfc\xef\x93\x79\x6c\xd0\xa3\xab\xff\x30\x61\x74\x5b\xe7\x2d\x8c\xb6\x71\xb3\xc5\x4b\x1f\x71\x02\xe2\x7f\xde\x33\x97\x75\x53\xd1\x76\xce\x9b\x0f\x43\xf8\xf4\x7a\xe4\x09\x4c\x7f\xfb\x91\x07\x19\xbf\xee\x9c\xf0\x9f\x43\xa9\x09\x0d\x2f\xae\x9a\x2d\xfa\x11\xa6\x7b\xf7\xce\x1b\xde\xdc\xea\x69\xb7\x7e\x22\x4e\x96\xb7\xed\xc6\x5e\xc6\xfa\x3a\x5a\x76\xb5\xd0\xd7\xb3\x6d\xe4\x86\x0f\xd7\x5b\x19\x7a\x57\x83\x5e\x20\xca\xb5\xcf\x00\x71\x6f\xcd\x3d\xa6\xbe\x7a\xc5\xd1\xab\xdf\x73\x7c\x1c\x01\x14\x3d\xd6\x7e\xc4\x21\x6d\xc7\x51\x76\x14\x95\xae\xb5\xd0\x3d\xdc\x1a\x0c\xda\xd6\xb8\x37\x87\x3a\xfe\x8e\xa8\x65\xd9\xe8\x5b\xa2\x2d\xdc\x96\x44\x90\x85\x5c\x8a\xcf\x6f\x6e\xae\xe8\xc3\x0a\x7d\xae\xf2\x02\x18\x9e\x91\x9c\x88\x55\x50\xd8\x5a\xd6\xee\xef\xef\x47\x3a\xfa\x5f\x42\x97\xe3\x59\x4e\x17\x63\x03\x87\x14\x8b\xa1\xc8\x60\xa8\x9e\x17\x79\x58\x0d\xef\x7c\x68\xc3\x7b\x22\x32\x13\x6d\xb0\xbf\xcb\xda\xa7\xb5\xf5\xb5\x3c\x29\x5a\x4f\xc5\x0b\x8a\xec\x83\xf3\x7a\xd5\xef\xd8\x98\x7a\xef\xc6\xe7\x79\x5f\x4c\x80\x28\x7a\x5f\x22\xcf\xc9\x3b\x1c\xbf\x34\x9f\x95\xf7\xda\xee\x96\x54\x46\xcc\x45\x62\x3e\x78\xd5\x43\xa5\xdc\x88\xcb\x3a\x04\x04\x8f\xb3\x70\x91\xf6\xc0\x8d\x83\x9e\x40\x91\x6e\x80\xcb\x00\x3f\x1e\xee\x35\xe0\x26\xdc\x08\x60\xad\xf5\xf7\x39\x65\xc6\x76\x28\xea\xdf\x37\xae\x6a\x8b\xfc\x3e\xec\xce\xad\x4f\xd7\xee\xc7\xdf\x54\xf4\xc0\xed\xf3\x6a\x7b\xf5\x95\x90\x9d\x27\x52\x27\x55\x62\x70\x8d\x43\x43\x40\x8f\x08\xf8\xb8\xc7\x82\xff\x29\xef\x85\x28\xcb\xd2\x5b\x02\x53\x7d\xd6\x1b\xad\x19\x65\x59\x59\x49\x9f\x04\x77\x9c\xc2\x1b\xb8\x6a\xf3\x1c\xff\x3a\xe1\x36\x23\xda\xd9\x6f\x07\x5d\x14\xea\xf9\x6d\x44\xe7\xc8\xc4\xd5\x10\x6c\xa5\x04\x72\x01\x0f\xc2\x7b\xc1\x49\x9f\x0b\xcd\x60\x4e\x19\x98\x3d\xba\x3a\x03\x2b\x74\xbd\x08\xb6\x12\x80\x3b\xf6\xec\xc2\x56\x09\xe9\x0f\xf0\x20\xdc\x3e\x23\xc4\xbf\x99\x59\x7b\xc4\x0b\xb6\xfa\x40\x8b\x8b\x14\x96\x25\x15\xd6\x0d\x35\x76\xca\xa7\xcf\x8b\x68\x91\xaf\xd0\x3d\x65\xb7\xdc\xda\x01\x4d\x6c\x49\x44\xb8\xda\x4a\x25\x74\x59\x32\xe0\x1c\xd2\xae\x4d\x6b\xc4\xc5\x2f\x4d\xdf\x60\x0e\x11\xeb\xe6\xb6\x7a\xdd\x89\x8a\x1e\x32\x54\x21\xae\x2c\x07\x6f\x6d\x04\x1a\x3f\x43\x27\x69\x8a\x70\xb1\xf2\xa3\x42\x34\x3d\xe9\xf5\x1d\xec\x78\x9f\x1a\xfa\x6b\x5d\xc7\x73\xf5\xdc\xb0\xed\xb4\xa3\x61\x4f\x22\x62\x9e\xa4\xe8\x1b\x46\x56\xb6\x78\x77\xb4\xbb\xb5\x11\x4b\x1b\x83\xef\xf5\xc3\xd2\x72\x15\xa8\x4f\x79\xf5\x41\x80\xa0\x08\xdb\xb3\x48\x6b\xfd\x30\x3b\xf1\xe7\xaa\x5e\x9a\x36\xdf\x10\xb1\x8b\x6c\xd7\x39\x6f\x86\xf9\x15\x83\x39\x79\x68\x98\x11\x15\x40\x34\xd0\x0d\x85\xc1\x4c\x86\x83\xcd\x36\x10\xfd\x45\x22\xdc\xfc\x10\x9e\xaf\xfc\xa6\x61\x6d\xfe\x4d\x42\xd2\x6c\xc5\x1b\x9d\xe6\x29\x33\x5c\x31\x4b\x8a\x92\x62\xfa\x76\x90\x72\x94\xda\xd6\x8f\x43\xa5\x9b\x57\x24\x1b\x53\xb0\xdb\x82\x6b\x9c\x06\xf6\x1a\xe6\x7b\x6f\x9d\xb7\xc6\x50\xe5\xd5\x38\x30\x2c\x35\xd8\xdf\xb6\x02\x9d\xcf\x07\x6d\x37\x01\xbb\xde\x36\x9f\xc6\x6d\x7f\x5d\xca\x47\xa3\x8d\x47\xed\x8c\xbf\x59\x9b\x1b\xcb\xdd\xd0\x2d\x4d\xf8\x1d\xf8\xee\xa0\x0f\x14\x81\x8b\xb0\x87\xef\x30\xc9\xd5\x59\xa9\xf5\x04\x31\xb2\xa5\x51\xc9\x18\xbb\x5b\xb3\xf5\x91\x2d\x3b\xdf\xf7\x14\x0a\x02\xe9\x08\x5d\x03\xe6\xd4\x04\x4e\x71\x9d\x3e\x53\x99\x61\xed\xed\x51\xe8\xbf\x02\xd6\xe1\xce\xde\x71\xe5\xad\x79\x43\x46\x07\xec\x46\x2a\xec\xbc\xba\x1b\x96\xe4\xb4\x4a\x25\x0b\xdc\x11\x25\x56\xad\x27\x88\xa4\x63\xa5\xd5\x95\xde\xcb\xee\x51\xdf\x79\x5b\xf8\xfc\xb7\x09\x0f\x6e\x4e\x9f\x83\x7b\x6f\x3a\x5e\x8a\x7e\x95\x55\x4a\x16\x15\x45\x9f\x70\x34\x03\xb9\xe6\x2c\x69\x41\x04\x65\x90\x7a\x50\x54\x3c\x15\xa9\x57\x99\x13\x4f\xc4\xe9\x5c\xdc\xcb\x95\x6a\x2f\x27\xb7\x80\xf8\x8a\xa7\x64\xb1\xdf\xee\x5f\x5f\x58\x72\x6d\x97\x7f\xf1\xf2\xaf\xe6\x8d\xbd\x2e\x83\x4e\x78\x93\x57\xd7\x3b\x3c\x0c\x9f\xfe\xb2\x5f\x0a\x52\xf9\xc8\xc3\x98\x6d\x5f\x13\x32\xbc\xc9\x3a\x75\x54\x1a\xfb\xe7\xff\x0f\x00\x00\xff\xff\x16\xc5\xc2\xbf\x91\xa0\x00\x00") func etcNginxTemplateNginxTmplBytes() ([]byte, error) { return bindataRead( @@ -105,7 +168,7 @@ func etcNginxTemplateNginxTmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "etc/nginx/template/nginx.tmpl", size: 39897, mode: os.FileMode(420), modTime: time.Unix(1521216438, 0)} + info := bindataFileInfo{name: "etc/nginx/template/nginx.tmpl", size: 41105, mode: os.FileMode(420), modTime: time.Unix(1521218836, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -125,7 +188,7 @@ func ingressControllerCleanNginxConfSh() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ingress-controller/clean-nginx-conf.sh", size: 901, mode: os.FileMode(493), modTime: time.Unix(1511087392, 0)} + info := bindataFileInfo{name: "ingress-controller/clean-nginx-conf.sh", size: 901, mode: os.FileMode(493), modTime: time.Unix(1519920732, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -182,6 +245,9 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ + "etc/nginx/lua/balancer.lua": etcNginxLuaBalancerLua, + "etc/nginx/lua/configuration.lua": etcNginxLuaConfigurationLua, + "etc/nginx/lua/util.lua": etcNginxLuaUtilLua, "etc/nginx/nginx.conf": etcNginxNginxConf, "etc/nginx/template/nginx.tmpl": etcNginxTemplateNginxTmpl, "ingress-controller/clean-nginx-conf.sh": ingressControllerCleanNginxConfSh, @@ -229,6 +295,11 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "etc": &bintree{nil, map[string]*bintree{ "nginx": &bintree{nil, map[string]*bintree{ + "lua": &bintree{nil, map[string]*bintree{ + "balancer.lua": &bintree{etcNginxLuaBalancerLua, map[string]*bintree{}}, + "configuration.lua": &bintree{etcNginxLuaConfigurationLua, map[string]*bintree{}}, + "util.lua": &bintree{etcNginxLuaUtilLua, map[string]*bintree{}}, + }}, "nginx.conf": &bintree{etcNginxNginxConf, map[string]*bintree{}}, "template": &bintree{nil, map[string]*bintree{ "nginx.tmpl": &bintree{etcNginxTemplateNginxTmpl, map[string]*bintree{}}, diff --git a/internal/ingress/controller/config/config.go b/internal/ingress/controller/config/config.go index e7a2ae66c9..0186a76585 100644 --- a/internal/ingress/controller/config/config.go +++ b/internal/ingress/controller/config/config.go @@ -604,23 +604,24 @@ func (cfg Configuration) BuildLogFormatUpstream() string { // TemplateConfig contains the nginx configuration to render the file nginx.conf type TemplateConfig struct { - ProxySetHeaders map[string]string - AddHeaders map[string]string - MaxOpenFiles int - BacklogSize int - Backends []*ingress.Backend - PassthroughBackends []*ingress.SSLPassthroughBackend - Servers []*ingress.Server - TCPBackends []ingress.L4Service - UDPBackends []ingress.L4Service - HealthzURI string - CustomErrors bool - Cfg Configuration - IsIPV6Enabled bool - IsSSLPassthroughEnabled bool - RedirectServers map[string]string - ListenPorts *ListenPorts - PublishService *apiv1.Service + ProxySetHeaders map[string]string + AddHeaders map[string]string + MaxOpenFiles int + BacklogSize int + Backends []*ingress.Backend + PassthroughBackends []*ingress.SSLPassthroughBackend + Servers []*ingress.Server + TCPBackends []ingress.L4Service + UDPBackends []ingress.L4Service + HealthzURI string + CustomErrors bool + Cfg Configuration + IsIPV6Enabled bool + IsSSLPassthroughEnabled bool + RedirectServers map[string]string + ListenPorts *ListenPorts + PublishService *apiv1.Service + DynamicConfigurationEnabled bool } // ListenPorts describe the ports required to run the diff --git a/internal/ingress/controller/controller.go b/internal/ingress/controller/controller.go index d85c916ea4..3fe0492c28 100644 --- a/internal/ingress/controller/controller.go +++ b/internal/ingress/controller/controller.go @@ -95,6 +95,8 @@ type Configuration struct { FakeCertificateSHA string SyncRateLimit float32 + + DynamicConfigurationEnabled bool } // GetPublishService returns the configured service used to set ingress status @@ -167,6 +169,15 @@ func (n *NGINXController) syncIngress(item interface{}) error { if !n.isForceReload() && n.runningConfig.Equal(&pcfg) { glog.V(3).Infof("skipping backend reload (no changes detected)") return nil + } else if !n.isForceReload() && n.cfg.DynamicConfigurationEnabled && n.IsDynamicallyConfigurable(&pcfg) { + err := n.ConfigureDynamically(&pcfg) + if err == nil { + glog.Infof("dynamic reconfiguration succeeded, skipping reload") + n.runningConfig = &pcfg + return nil + } + + glog.Warningf("falling back to reload, could not dynamically reconfigure: %v", err) } glog.Infof("backend reload required") @@ -182,6 +193,19 @@ func (n *NGINXController) syncIngress(item interface{}) error { incReloadCount() setSSLExpireTime(servers) + if n.isForceReload() && n.cfg.DynamicConfigurationEnabled { + go func() { + // it takes time for Nginx to start listening on the port + time.Sleep(1 * time.Second) + err := n.ConfigureDynamically(&pcfg) + if err == nil { + glog.Infof("dynamic reconfiguration succeeded") + } else { + glog.Warningf("could not dynamically reconfigure: %v", err) + } + }() + } + n.runningConfig = &pcfg n.SetForceReload(false) diff --git a/internal/ingress/controller/nginx.go b/internal/ingress/controller/nginx.go index d77b6d8b25..a4361cfba3 100644 --- a/internal/ingress/controller/nginx.go +++ b/internal/ingress/controller/nginx.go @@ -18,10 +18,12 @@ package controller import ( "bytes" + "encoding/json" "errors" "fmt" "io/ioutil" "net" + "net/http" "os" "os/exec" "strconv" @@ -606,23 +608,24 @@ func (n *NGINXController) OnUpdate(ingressCfg ingress.Configuration) error { cfg.SSLDHParam = sslDHParam tc := ngx_config.TemplateConfig{ - ProxySetHeaders: setHeaders, - AddHeaders: addHeaders, - MaxOpenFiles: maxOpenFiles, - BacklogSize: sysctlSomaxconn(), - Backends: ingressCfg.Backends, - PassthroughBackends: ingressCfg.PassthroughBackends, - Servers: ingressCfg.Servers, - TCPBackends: ingressCfg.TCPEndpoints, - UDPBackends: ingressCfg.UDPEndpoints, - HealthzURI: ngxHealthPath, - CustomErrors: len(cfg.CustomHTTPErrors) > 0, - Cfg: cfg, - IsIPV6Enabled: n.isIPV6Enabled && !cfg.DisableIpv6, - RedirectServers: redirectServers, - IsSSLPassthroughEnabled: n.cfg.EnableSSLPassthrough, - ListenPorts: n.cfg.ListenPorts, - PublishService: n.GetPublishService(), + ProxySetHeaders: setHeaders, + AddHeaders: addHeaders, + MaxOpenFiles: maxOpenFiles, + BacklogSize: sysctlSomaxconn(), + Backends: ingressCfg.Backends, + PassthroughBackends: ingressCfg.PassthroughBackends, + Servers: ingressCfg.Servers, + TCPBackends: ingressCfg.TCPEndpoints, + UDPBackends: ingressCfg.UDPEndpoints, + HealthzURI: ngxHealthPath, + CustomErrors: len(cfg.CustomHTTPErrors) > 0, + Cfg: cfg, + IsIPV6Enabled: n.isIPV6Enabled && !cfg.DisableIpv6, + RedirectServers: redirectServers, + IsSSLPassthroughEnabled: n.cfg.EnableSSLPassthrough, + ListenPorts: n.cfg.ListenPorts, + PublishService: n.GetPublishService(), + DynamicConfigurationEnabled: n.cfg.DynamicConfigurationEnabled, } content, err := n.t.Write(tc) @@ -745,3 +748,43 @@ func (n *NGINXController) setupSSLProxy() { } }() } + +// IsDynamicallyConfigurable decides if the new configuration can be dynamically configured without reloading +func (n *NGINXController) IsDynamicallyConfigurable(pcfg *ingress.Configuration) bool { + var copyOfRunningConfig ingress.Configuration = *n.runningConfig + var copyOfPcfg ingress.Configuration = *pcfg + + copyOfRunningConfig.Backends = []*ingress.Backend{} + copyOfPcfg.Backends = []*ingress.Backend{} + + return copyOfRunningConfig.Equal(©OfPcfg) +} + +// ConfigureDynamically JSON encodes new Backends and POSTs it to an internal HTTP endpoint +// that is handled by Lua +func (n *NGINXController) ConfigureDynamically(pcfg *ingress.Configuration) error { + buf, err := json.Marshal(pcfg.Backends) + if err != nil { + return err + } + + glog.V(2).Infof("posting backends configuration: %s", buf) + + url := fmt.Sprintf("http://localhost:%d/configuration/backends", n.cfg.ListenPorts.Status) + resp, err := http.Post(url, "application/json", bytes.NewReader(buf)) + if err != nil { + return err + } + + defer func() { + if err := resp.Body.Close(); err != nil { + glog.Warningf("error while closing response body: \n%v", err) + } + }() + + if resp.StatusCode != http.StatusCreated { + return fmt.Errorf("Unexpected error code: %d", resp.StatusCode) + } + + return nil +} diff --git a/internal/ingress/controller/nginx_test.go b/internal/ingress/controller/nginx_test.go index 4b85ed2fc8..7be8ce135d 100644 --- a/internal/ingress/controller/nginx_test.go +++ b/internal/ingress/controller/nginx_test.go @@ -16,7 +16,78 @@ limitations under the License. package controller -import "testing" +import ( + "testing" + + "k8s.io/ingress-nginx/internal/ingress" +) + +func TestIsDynamicallyConfigurable(t *testing.T) { + backends := []*ingress.Backend{{ + Name: "fakenamespace-myapp-80", + Endpoints: []ingress.Endpoint{ + { + Address: "10.0.0.1", + Port: "8080", + }, + { + Address: "10.0.0.2", + Port: "8080", + }, + }, + }} + + servers := []*ingress.Server{{ + Hostname: "myapp.fake", + Locations: []*ingress.Location{ + { + Path: "/", + Backend: "fakenamespace-myapp-80", + }, + }, + }} + + commonConfig := &ingress.Configuration{ + Backends: backends, + Servers: servers, + } + + n := &NGINXController{ + runningConfig: &ingress.Configuration{ + Backends: backends, + Servers: servers, + }, + } + + newConfig := commonConfig + if !n.IsDynamicallyConfigurable(newConfig) { + t.Errorf("When new config is same as the running config it should be deemed as dynamically configurable") + } + + newConfig = &ingress.Configuration{ + Backends: []*ingress.Backend{{Name: "another-backend-8081"}}, + Servers: []*ingress.Server{{Hostname: "myapp1.fake"}}, + } + if n.IsDynamicallyConfigurable(newConfig) { + t.Errorf("Expected to not be dynamically configurable when there's more than just backends change") + } + + newConfig = &ingress.Configuration{ + Backends: []*ingress.Backend{{Name: "a-backend-8080"}}, + Servers: servers, + } + if !n.IsDynamicallyConfigurable(newConfig) { + t.Errorf("Expected to be dynamically configurable when only backends change") + } + + if !n.runningConfig.Equal(commonConfig) { + t.Errorf("Expected running config to not change") + } + + if !newConfig.Equal(&ingress.Configuration{Backends: []*ingress.Backend{{Name: "a-backend-8080"}}, Servers: servers}) { + t.Errorf("Expected new config to not change") + } +} func TestNginxHashBucketSize(t *testing.T) { tests := []struct { diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index 24556e0c16..efea1bec72 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -307,7 +307,7 @@ func buildLoadBalancingConfig(b interface{}, fallbackLoadBalancing string) strin // (specified through the nginx.ingress.kubernetes.io/rewrite-to annotation) // If the annotation nginx.ingress.kubernetes.io/add-base-url:"true" is specified it will // add a base tag in the head of the response from the service -func buildProxyPass(host string, b interface{}, loc interface{}) string { +func buildProxyPass(host string, b interface{}, loc interface{}, dynamicConfigurationEnabled bool) string { backends, ok := b.([]*ingress.Backend) if !ok { glog.Errorf("expected an '[]*ingress.Backend' type but %T was returned", b) @@ -323,14 +323,19 @@ func buildProxyPass(host string, b interface{}, loc interface{}) string { path := location.Path proto := "http" - upstreamName := location.Backend + upstreamName := "upstream_balancer" + + if !dynamicConfigurationEnabled { + upstreamName = location.Backend + } + for _, backend := range backends { if backend.Name == location.Backend { if backend.Secure || backend.SSLPassthrough { proto = "https" } - if isSticky(host, location, backend.SessionAffinity.CookieSessionAffinity.Locations) { + if !dynamicConfigurationEnabled && isSticky(host, location, backend.SessionAffinity.CookieSessionAffinity.Locations) { upstreamName = fmt.Sprintf("sticky-%v", upstreamName) } @@ -340,6 +345,7 @@ func buildProxyPass(host string, b interface{}, loc interface{}) string { // defProxyPass returns the default proxy_pass, just the name of the upstream defProxyPass := fmt.Sprintf("proxy_pass %s://%s;", proto, upstreamName) + // if the path in the ingress rule is equals to the target: no special rewrite if path == location.Rewrite.Target { return defProxyPass diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index 6502999155..f430144fdb 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -37,72 +37,262 @@ import ( ) var ( - // TODO: add tests for secure endpoints + // TODO: add tests for SSLPassthrough tmplFuncTestcases = map[string]struct { - Path string - Target string - Location string - ProxyPass string - AddBaseURL bool - BaseURLScheme string - Sticky bool - XForwardedPrefix bool + Path string + Target string + Location string + ProxyPass string + AddBaseURL bool + BaseURLScheme string + Sticky bool + XForwardedPrefix bool + DynamicConfigurationEnabled bool + SecureBackend bool }{ - "invalid redirect / to /": {"/", "/", "/", "proxy_pass http://upstream-name;", false, "", false, false}, - "redirect / to /jenkins": {"/", "/jenkins", "~* /", + "when secure backend enabled": { + "/", + "/", + "/", + "proxy_pass https://upstream-name;", + false, + "", + false, + false, + false, + true}, + "when secure backend and stickeness enabled": { + "/", + "/", + "/", + "proxy_pass https://sticky-upstream-name;", + false, + "", + true, + false, + false, + true}, + "when secure backend and dynamic config enabled": { + "/", + "/", + "/", + "proxy_pass https://upstream_balancer;", + false, + "", + false, + false, + true, + true}, + "when secure backend, stickeness and dynamic config enabled": { + "/", + "/", + "/", + "proxy_pass https://upstream_balancer;", + false, + "", + true, + false, + true, + true}, + "invalid redirect / to / with dynamic config enabled": { + "/", + "/", + "/", + "proxy_pass http://upstream_balancer;", + false, + "", + false, + false, + true, + false}, + "invalid redirect / to /": { + "/", + "/", + "/", + "proxy_pass http://upstream-name;", + false, + "", + false, + false, + false, + false}, + "redirect / to /jenkins": { + "/", + "/jenkins", + "~* /", ` rewrite /(.*) /jenkins/$1 break; proxy_pass http://upstream-name; - `, false, "", false, false}, - "redirect /something to /": {"/something", "/", `~* ^/something\/?(?.*)`, ` + `, + false, + "", + false, + false, + false, + false}, + "redirect /something to /": { + "/something", + "/", + `~* ^/something\/?(?.*)`, + ` rewrite /something/(.*) /$1 break; rewrite /something / break; proxy_pass http://upstream-name; - `, false, "", false, false}, - "redirect /end-with-slash/ to /not-root": {"/end-with-slash/", "/not-root", "~* ^/end-with-slash/(?.*)", ` + `, + false, + "", + false, + false, + false, + false}, + "redirect /end-with-slash/ to /not-root": { + "/end-with-slash/", + "/not-root", + "~* ^/end-with-slash/(?.*)", + ` rewrite /end-with-slash/(.*) /not-root/$1 break; proxy_pass http://upstream-name; - `, false, "", false, false}, - "redirect /something-complex to /not-root": {"/something-complex", "/not-root", `~* ^/something-complex\/?(?.*)`, ` + `, + false, + "", + false, + false, + false, + false}, + "redirect /something-complex to /not-root": { + "/something-complex", + "/not-root", + `~* ^/something-complex\/?(?.*)`, + ` rewrite /something-complex/(.*) /not-root/$1 break; proxy_pass http://upstream-name; - `, false, "", false, false}, - "redirect / to /jenkins and rewrite": {"/", "/jenkins", "~* /", ` + `, + false, + "", + false, + false, + false, + false}, + "redirect / to /jenkins and rewrite": { + "/", + "/jenkins", + "~* /", + ` rewrite /(.*) /jenkins/$1 break; proxy_pass http://upstream-name; subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, true, "", false, false}, - "redirect /something to / and rewrite": {"/something", "/", `~* ^/something\/?(?.*)`, ` + `, + true, + "", + false, + false, + false, + false}, + "redirect /something to / and rewrite": { + "/something", + "/", + `~* ^/something\/?(?.*)`, + ` rewrite /something/(.*) /$1 break; rewrite /something / break; proxy_pass http://upstream-name; subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, true, "", false, false}, - "redirect /end-with-slash/ to /not-root and rewrite": {"/end-with-slash/", "/not-root", `~* ^/end-with-slash/(?.*)`, ` + `, + true, + "", + false, + false, + false, + false}, + "redirect /end-with-slash/ to /not-root and rewrite": { + "/end-with-slash/", + "/not-root", + `~* ^/end-with-slash/(?.*)`, + ` rewrite /end-with-slash/(.*) /not-root/$1 break; proxy_pass http://upstream-name; subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, true, "", false, false}, - "redirect /something-complex to /not-root and rewrite": {"/something-complex", "/not-root", `~* ^/something-complex\/?(?.*)`, ` + `, + true, + "", + false, + false, + false, + false}, + "redirect /something-complex to /not-root and rewrite": { + "/something-complex", + "/not-root", + `~* ^/something-complex\/?(?.*)`, + ` rewrite /something-complex/(.*) /not-root/$1 break; proxy_pass http://upstream-name; subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, true, "", false, false}, - "redirect /something to / and rewrite with specific scheme": {"/something", "/", `~* ^/something\/?(?.*)`, ` + `, + true, + "", + false, + false, + false, + false}, + "redirect /something to / and rewrite with specific scheme": { + "/something", + "/", + `~* ^/something\/?(?.*)`, + ` rewrite /something/(.*) /$1 break; rewrite /something / break; proxy_pass http://upstream-name; subs_filter '(<(?:H|h)(?:E|e)(?:A|a)(?:D|d)(?:[^">]|"[^"]*")*>)' '$1' ro; - `, true, "http", false, false}, - "redirect / to /something with sticky enabled": {"/", "/something", `~* /`, ` + `, + true, + "http", + false, + false, + false, + false}, + "redirect / to /something with sticky enabled": { + "/", + "/something", + `~* /`, + ` rewrite /(.*) /something/$1 break; proxy_pass http://sticky-upstream-name; - `, false, "http", true, false}, - "add the X-Forwarded-Prefix header": {"/there", "/something", `~* ^/there\/?(?.*)`, ` + `, + false, + "http", + true, + false, + false, + false}, + "redirect / to /something with sticky and dynamic config enabled": { + "/", + "/something", + `~* /`, + ` + rewrite /(.*) /something/$1 break; + proxy_pass http://upstream_balancer; + `, + false, + "http", + true, + false, + true, + false}, + "add the X-Forwarded-Prefix header": { + "/there", + "/something", + `~* ^/there\/?(?.*)`, + ` rewrite /there/(.*) /something/$1 break; proxy_set_header X-Forwarded-Prefix "/there/"; proxy_pass http://sticky-upstream-name; - `, false, "http", true, true}, + `, + false, + "http", + true, + true, + false, + false}, } ) @@ -151,24 +341,25 @@ func TestBuildProxyPass(t *testing.T) { XForwardedPrefix: tc.XForwardedPrefix, } - backends := []*ingress.Backend{} + backend := &ingress.Backend{ + Name: defaultBackend, + Secure: tc.SecureBackend, + } + if tc.Sticky { - backends = []*ingress.Backend{ - { - Name: defaultBackend, - SessionAffinity: ingress.SessionAffinityConfig{ - AffinityType: "cookie", - CookieSessionAffinity: ingress.CookieSessionAffinity{ - Locations: map[string][]string{ - defaultHost: {tc.Path}, - }, - }, + backend.SessionAffinity = ingress.SessionAffinityConfig{ + AffinityType: "cookie", + CookieSessionAffinity: ingress.CookieSessionAffinity{ + Locations: map[string][]string{ + defaultHost: {tc.Path}, }, }, } } - pp := buildProxyPass(defaultHost, backends, loc) + backends := []*ingress.Backend{backend} + + pp := buildProxyPass(defaultHost, backends, loc, tc.DynamicConfigurationEnabled) if !strings.EqualFold(tc.ProxyPass, pp) { t.Errorf("%s: expected \n'%v'\nbut returned \n'%v'", k, tc.ProxyPass, pp) } diff --git a/rootfs/etc/nginx/lua/balancer.lua b/rootfs/etc/nginx/lua/balancer.lua new file mode 100644 index 0000000000..be07405e13 --- /dev/null +++ b/rootfs/etc/nginx/lua/balancer.lua @@ -0,0 +1,107 @@ +local ngx_balancer = require("ngx.balancer") +local json = require("cjson") +local configuration = require("configuration") +local util = require("util") +local lrucache = require("resty.lrucache") +local resty_lock = require("resty.lock") + +-- measured in seconds +-- for an Nginx worker to pick up the new list of upstream peers +-- it will take + BACKENDS_SYNC_INTERVAL +local BACKENDS_SYNC_INTERVAL = 1 + +ROUND_ROBIN_LOCK_KEY = "round_robin" + +local round_robin_state = ngx.shared.round_robin_state + +local _M = {} + +local round_robin_lock = resty_lock:new("locks", {timeout = 0, exptime = 0.1}) + +local backends, err = lrucache.new(1024) +if not backends then + return error("failed to create the cache for backends: " .. (err or "unknown")) +end + +local function balance() + local backend_name = ngx.var.proxy_upstream_name + local backend = backends:get(backend_name) + -- lb_alg field does not exist for ingress.Backend struct for now, so lb_alg + -- will always be round_robin + local lb_alg = backend.lb_alg or "round_robin" + + if lb_alg == "ip_hash" then + -- TODO(elvinefendi) implement me + return backend.endpoints[0].address, backend.endpoints[0].port + end + + -- Round-Robin + round_robin_lock:lock(backend_name .. ROUND_ROBIN_LOCK_KEY) + local index = round_robin_state:get(backend_name) + local index, endpoint = next(backend.endpoints, index) + if not index then + index = 1 + endpoint = backend.endpoints[index] + end + round_robin_state:set(backend_name, index) + round_robin_lock:unlock(backend_name .. ROUND_ROBIN_LOCK_KEY) + + return endpoint.address, endpoint.port +end + +local function sync_backend(backend) + backends:set(backend.name, backend) + + -- also reset the respective balancer state since backend has changed + round_robin_state:delete(backend.name) + + ngx.log(ngx.INFO, "syncronization completed for: " .. backend.name) +end + +local function sync_backends() + local backends_data = configuration.get_backends_data() + if not backends_data then + return + end + + local ok, new_backends = pcall(json.decode, backends_data) + if not ok then + ngx.log(ngx.ERR, "could not parse backends data: " .. tostring(new_backends)) + return + end + + for _, new_backend in pairs(new_backends) do + local backend = backends:get(new_backend.name) + local backend_changed = true + + if backend then + backend_changed = not util.deep_compare(backend, new_backend) + end + + if backend_changed then + sync_backend(new_backend) + end + end +end + +function _M.init_worker() + _, err = ngx.timer.every(BACKENDS_SYNC_INTERVAL, sync_backends) + if err then + ngx.log(ngx.ERR, "error when setting up timer.every for sync_backends: " .. tostring(err)) + end +end + +function _M.call() + ngx_balancer.set_more_tries(1) + + local host, port = balance() + + local ok, err = ngx_balancer.set_current_peer(host, port) + if ok then + ngx.log(ngx.INFO, "current peer is set to " .. host .. ":" .. port) + else + ngx.log(ngx.ERR, "error while setting current upstream peer to: " .. tostring(err)) + end +end + +return _M diff --git a/rootfs/etc/nginx/lua/configuration.lua b/rootfs/etc/nginx/lua/configuration.lua new file mode 100644 index 0000000000..5007722469 --- /dev/null +++ b/rootfs/etc/nginx/lua/configuration.lua @@ -0,0 +1,41 @@ +-- this is the Lua representation of Configuration struct in internal/ingress/types.go +local configuration_data = ngx.shared.configuration_data + +local _M = {} + +function _M.get_backends_data() + return configuration_data:get("backends") +end + +function _M.call() + if ngx.var.request_method ~= "POST" and ngx.var.request_method ~= "GET" then + ngx.status = ngx.HTTP_BAD_REQUEST + ngx.print("Only POST and GET requests are allowed!") + return + end + + if ngx.var.request_uri ~= "/configuration/backends" then + ngx.status = ngx.HTTP_NOT_FOUND + ngx.print("Not found!") + return + end + + if ngx.var.request_method == "GET" then + ngx.status = ngx.HTTP_OK + ngx.print(_M.get_backends_data()) + return + end + + ngx.req.read_body() + + local success, err = configuration_data:set("backends", ngx.req.get_body_data()) + if not success then + ngx.log(ngx.ERR, "error while saving configuration: " .. tostring(err)) + ngx.status = ngx.HTTP_BAD_REQUEST + return + end + + ngx.status = ngx.HTTP_CREATED +end + +return _M diff --git a/rootfs/etc/nginx/lua/util.lua b/rootfs/etc/nginx/lua/util.lua new file mode 100644 index 0000000000..19e104f092 --- /dev/null +++ b/rootfs/etc/nginx/lua/util.lua @@ -0,0 +1,27 @@ +local _M = {} + +-- this implementation is taken from +-- https://web.archive.org/web/20131225070434/http://snippets.luacode.org/snippets/Deep_Comparison_of_Two_Values_3 +-- and modified for use in this project +local function deep_compare(t1, t2, ignore_mt) + local ty1 = type(t1) + local ty2 = type(t2) + if ty1 ~= ty2 then return false end + -- non-table types can be directly compared + if ty1 ~= 'table' and ty2 ~= 'table' then return t1 == t2 end + -- as well as tables which have the metamethod __eq + local mt = getmetatable(t1) + if not ignore_mt and mt and mt.__eq then return t1 == t2 end + for k1,v1 in pairs(t1) do + local v2 = t2[k1] + if v2 == nil or not deep_compare(v1,v2) then return false end + end + for k2,v2 in pairs(t2) do + local v1 = t1[k2] + if v1 == nil or not deep_compare(v1,v2) then return false end + end + return true +end +_M.deep_compare = deep_compare + +return _M diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index b9831baafb..e269df0092 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -36,6 +36,39 @@ events { } http { + lua_package_cpath "/usr/local/lib/lua/?.so;/usr/lib/x86_64-linux-gnu/lua/5.1/?.so;;"; + lua_package_path "/etc/nginx/lua/?.lua;/etc/nginx/lua/vendor/?.lua;/usr/local/lib/lua/?.lua;;"; + + lua_shared_dict configuration_data 5M; + lua_shared_dict round_robin_state 1M; + lua_shared_dict locks 512k; + + init_by_lua_block { + require("resty.core") + collectgarbage("collect") + + -- init modules + local ok, res + + ok, res = pcall(require, "configuration") + if not ok then + error("require failed: " .. tostring(res)) + else + configuration = res + end + + ok, res = pcall(require, "balancer") + if not ok then + error("require failed: " .. tostring(res)) + else + balancer = res + end + } + + init_worker_by_lua_block { + balancer.init_worker() + } + {{/* we use the value of the header X-Forwarded-For to be able to use the geo_ip module */}} {{ if $cfg.UseProxyProtocol }} real_ip_header proxy_protocol; @@ -308,6 +341,7 @@ http { {{ $cfg.HTTPSnippet }} {{ end }} + {{ if not $all.DynamicConfigurationEnabled }} {{ range $name, $upstream := $backends }} {{ if eq $upstream.SessionAffinity.AffinityType "cookie" }} upstream sticky-{{ $upstream.Name }} { @@ -319,9 +353,7 @@ http { {{ range $server := $upstream.Endpoints }}server {{ $server.Address | formatIP }}:{{ $server.Port }} max_fails={{ $server.MaxFails }} fail_timeout={{ $server.FailTimeout }}; {{ end }} - } - {{ end }} upstream {{ $upstream.Name }} { @@ -334,8 +366,18 @@ http { {{ range $server := $upstream.Endpoints }}server {{ $server.Address | formatIP }}:{{ $server.Port }} max_fails={{ $server.MaxFails }} fail_timeout={{ $server.FailTimeout }}; {{ end }} } - {{ end }} + {{ end }} + + upstream upstream_balancer { + server 0.0.0.1; # placeholder + + balancer_by_lua_block { + balancer.call() + } + + keepalive 1000; + } {{/* build the maps that will be use to validate the Whitelist */}} {{ range $index, $server := $servers }} @@ -452,12 +494,24 @@ http { {{ end }} } + location /configuration { + allow 127.0.0.1; + deny all; + content_by_lua_block { + configuration.call() + } + } + location / { {{ if .CustomErrors }} proxy_set_header X-Code 404; {{ end }} set $proxy_upstream_name "upstream-default-backend"; + {{ if $all.DynamicConfigurationEnabled }} + proxy_pass http://upstream_balancer; + {{ else }} proxy_pass http://upstream-default-backend; + {{ end }} } {{ template "CUSTOM_ERRORS" $all }} @@ -550,7 +604,12 @@ stream { proxy_set_header X-Service-Name $service_name; rewrite (.*) / break; - proxy_pass http://upstream-default-backend; + + {{ if .DynamicConfigurationEnabled }} + proxy_pass http://upstream_balancer; + {{ else }} + proxy_pass http://upstream-default-backend; + {{ end }} } {{ end }} {{ end }} @@ -887,7 +946,7 @@ stream { {{ end }} {{ if not (empty $location.Backend) }} - {{ buildProxyPass $server.Hostname $all.Backends $location }} + {{ buildProxyPass $server.Hostname $all.Backends $location $all.DynamicConfigurationEnabled }} {{ if (or (eq $location.Proxy.ProxyRedirectFrom "default") (eq $location.Proxy.ProxyRedirectFrom "off")) }} proxy_redirect {{ $location.Proxy.ProxyRedirectFrom }}; {{ else }}