// Package main is an autogenerated binder stub for package keywords.
//   gobind -lang=go keywords
//
// File is generated by gobind. Do not edit.
package main

/*
#include <stdlib.h>
#include <stdint.h>
#include "seq.h"
#include "keywords.h"

*/
import "C"

import (
	_seq "golang.org/x/mobile/bind/seq"
	"keywords"
)

// suppress the error if seq ends up unused
var _ = _seq.FromRefNum

//export proxykeywords_KeywordCaller_Abstract
func proxykeywords_KeywordCaller_Abstract(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Abstract()
}

//export proxykeywords_KeywordCaller_Assert
func proxykeywords_KeywordCaller_Assert(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Assert()
}

//export proxykeywords_KeywordCaller_Bool
func proxykeywords_KeywordCaller_Bool(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Bool()
}

//export proxykeywords_KeywordCaller_Boolean
func proxykeywords_KeywordCaller_Boolean(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Boolean()
}

//export proxykeywords_KeywordCaller_Break
func proxykeywords_KeywordCaller_Break(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Break()
}

//export proxykeywords_KeywordCaller_Byte
func proxykeywords_KeywordCaller_Byte(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Byte()
}

//export proxykeywords_KeywordCaller_Case
func proxykeywords_KeywordCaller_Case(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Case()
}

//export proxykeywords_KeywordCaller_Catch
func proxykeywords_KeywordCaller_Catch(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Catch()
}

//export proxykeywords_KeywordCaller_Char
func proxykeywords_KeywordCaller_Char(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Char()
}

//export proxykeywords_KeywordCaller_Class
func proxykeywords_KeywordCaller_Class(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Class()
}

//export proxykeywords_KeywordCaller_Const
func proxykeywords_KeywordCaller_Const(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Const()
}

//export proxykeywords_KeywordCaller_Continue
func proxykeywords_KeywordCaller_Continue(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Continue()
}

//export proxykeywords_KeywordCaller_Default
func proxykeywords_KeywordCaller_Default(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Default()
}

//export proxykeywords_KeywordCaller_Do
func proxykeywords_KeywordCaller_Do(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Do()
}

//export proxykeywords_KeywordCaller_Double
func proxykeywords_KeywordCaller_Double(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Double()
}

//export proxykeywords_KeywordCaller_Else
func proxykeywords_KeywordCaller_Else(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Else()
}

//export proxykeywords_KeywordCaller_Enum
func proxykeywords_KeywordCaller_Enum(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Enum()
}

//export proxykeywords_KeywordCaller_Extends
func proxykeywords_KeywordCaller_Extends(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Extends()
}

//export proxykeywords_KeywordCaller_False
func proxykeywords_KeywordCaller_False(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.False()
}

//export proxykeywords_KeywordCaller_Final
func proxykeywords_KeywordCaller_Final(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Final()
}

//export proxykeywords_KeywordCaller_Finally
func proxykeywords_KeywordCaller_Finally(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Finally()
}

//export proxykeywords_KeywordCaller_Float
func proxykeywords_KeywordCaller_Float(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Float()
}

//export proxykeywords_KeywordCaller_For
func proxykeywords_KeywordCaller_For(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.For()
}

//export proxykeywords_KeywordCaller_Goto
func proxykeywords_KeywordCaller_Goto(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Goto()
}

//export proxykeywords_KeywordCaller_If
func proxykeywords_KeywordCaller_If(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.If()
}

//export proxykeywords_KeywordCaller_Implements
func proxykeywords_KeywordCaller_Implements(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Implements()
}

//export proxykeywords_KeywordCaller_Import
func proxykeywords_KeywordCaller_Import(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Import()
}

//export proxykeywords_KeywordCaller_Instanceof
func proxykeywords_KeywordCaller_Instanceof(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Instanceof()
}

//export proxykeywords_KeywordCaller_Int
func proxykeywords_KeywordCaller_Int(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Int()
}

//export proxykeywords_KeywordCaller_Interface
func proxykeywords_KeywordCaller_Interface(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Interface()
}

//export proxykeywords_KeywordCaller_Long
func proxykeywords_KeywordCaller_Long(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Long()
}

//export proxykeywords_KeywordCaller_Native
func proxykeywords_KeywordCaller_Native(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Native()
}

//export proxykeywords_KeywordCaller_New
func proxykeywords_KeywordCaller_New(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.New()
}

//export proxykeywords_KeywordCaller_Nil
func proxykeywords_KeywordCaller_Nil(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Nil()
}

//export proxykeywords_KeywordCaller_Null
func proxykeywords_KeywordCaller_Null(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Null()
}

//export proxykeywords_KeywordCaller_Package
func proxykeywords_KeywordCaller_Package(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Package()
}

//export proxykeywords_KeywordCaller_Private
func proxykeywords_KeywordCaller_Private(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Private()
}

//export proxykeywords_KeywordCaller_Protected
func proxykeywords_KeywordCaller_Protected(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Protected()
}

//export proxykeywords_KeywordCaller_Public
func proxykeywords_KeywordCaller_Public(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Public()
}

//export proxykeywords_KeywordCaller_Return
func proxykeywords_KeywordCaller_Return(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Return()
}

//export proxykeywords_KeywordCaller_Short
func proxykeywords_KeywordCaller_Short(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Short()
}

//export proxykeywords_KeywordCaller_Static
func proxykeywords_KeywordCaller_Static(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Static()
}

//export proxykeywords_KeywordCaller_Strictfp
func proxykeywords_KeywordCaller_Strictfp(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Strictfp()
}

//export proxykeywords_KeywordCaller_Super
func proxykeywords_KeywordCaller_Super(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Super()
}

//export proxykeywords_KeywordCaller_Switch
func proxykeywords_KeywordCaller_Switch(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Switch()
}

//export proxykeywords_KeywordCaller_Synchronized
func proxykeywords_KeywordCaller_Synchronized(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Synchronized()
}

//export proxykeywords_KeywordCaller_This
func proxykeywords_KeywordCaller_This(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.This()
}

//export proxykeywords_KeywordCaller_Throw
func proxykeywords_KeywordCaller_Throw(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Throw()
}

//export proxykeywords_KeywordCaller_Throws
func proxykeywords_KeywordCaller_Throws(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Throws()
}

//export proxykeywords_KeywordCaller_Transient
func proxykeywords_KeywordCaller_Transient(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Transient()
}

//export proxykeywords_KeywordCaller_True
func proxykeywords_KeywordCaller_True(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.True()
}

//export proxykeywords_KeywordCaller_Try
func proxykeywords_KeywordCaller_Try(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Try()
}

//export proxykeywords_KeywordCaller_Void
func proxykeywords_KeywordCaller_Void(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Void()
}

//export proxykeywords_KeywordCaller_Volatile
func proxykeywords_KeywordCaller_Volatile(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Volatile()
}

//export proxykeywords_KeywordCaller_While
func proxykeywords_KeywordCaller_While(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.While()
}

type proxykeywords_KeywordCaller _seq.Ref

func (p *proxykeywords_KeywordCaller) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }

func (p *proxykeywords_KeywordCaller) Abstract() {
	C.cproxykeywords_KeywordCaller_Abstract(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Assert() {
	C.cproxykeywords_KeywordCaller_Assert(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Bool() {
	C.cproxykeywords_KeywordCaller_Bool(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Boolean() {
	C.cproxykeywords_KeywordCaller_Boolean(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Break() {
	C.cproxykeywords_KeywordCaller_Break(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Byte() {
	C.cproxykeywords_KeywordCaller_Byte(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Case() {
	C.cproxykeywords_KeywordCaller_Case(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Catch() {
	C.cproxykeywords_KeywordCaller_Catch(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Char() {
	C.cproxykeywords_KeywordCaller_Char(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Class() {
	C.cproxykeywords_KeywordCaller_Class(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Const() {
	C.cproxykeywords_KeywordCaller_Const(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Continue() {
	C.cproxykeywords_KeywordCaller_Continue(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Default() {
	C.cproxykeywords_KeywordCaller_Default(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Do() {
	C.cproxykeywords_KeywordCaller_Do(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Double() {
	C.cproxykeywords_KeywordCaller_Double(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Else() {
	C.cproxykeywords_KeywordCaller_Else(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Enum() {
	C.cproxykeywords_KeywordCaller_Enum(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Extends() {
	C.cproxykeywords_KeywordCaller_Extends(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) False() {
	C.cproxykeywords_KeywordCaller_False(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Final() {
	C.cproxykeywords_KeywordCaller_Final(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Finally() {
	C.cproxykeywords_KeywordCaller_Finally(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Float() {
	C.cproxykeywords_KeywordCaller_Float(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) For() {
	C.cproxykeywords_KeywordCaller_For(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Goto() {
	C.cproxykeywords_KeywordCaller_Goto(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) If() {
	C.cproxykeywords_KeywordCaller_If(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Implements() {
	C.cproxykeywords_KeywordCaller_Implements(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Import() {
	C.cproxykeywords_KeywordCaller_Import(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Instanceof() {
	C.cproxykeywords_KeywordCaller_Instanceof(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Int() {
	C.cproxykeywords_KeywordCaller_Int(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Interface() {
	C.cproxykeywords_KeywordCaller_Interface(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Long() {
	C.cproxykeywords_KeywordCaller_Long(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Native() {
	C.cproxykeywords_KeywordCaller_Native(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) New() {
	C.cproxykeywords_KeywordCaller_New(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Nil() {
	C.cproxykeywords_KeywordCaller_Nil(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Null() {
	C.cproxykeywords_KeywordCaller_Null(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Package() {
	C.cproxykeywords_KeywordCaller_Package(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Private() {
	C.cproxykeywords_KeywordCaller_Private(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Protected() {
	C.cproxykeywords_KeywordCaller_Protected(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Public() {
	C.cproxykeywords_KeywordCaller_Public(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Return() {
	C.cproxykeywords_KeywordCaller_Return(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Short() {
	C.cproxykeywords_KeywordCaller_Short(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Static() {
	C.cproxykeywords_KeywordCaller_Static(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Strictfp() {
	C.cproxykeywords_KeywordCaller_Strictfp(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Super() {
	C.cproxykeywords_KeywordCaller_Super(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Switch() {
	C.cproxykeywords_KeywordCaller_Switch(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Synchronized() {
	C.cproxykeywords_KeywordCaller_Synchronized(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) This() {
	C.cproxykeywords_KeywordCaller_This(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Throw() {
	C.cproxykeywords_KeywordCaller_Throw(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Throws() {
	C.cproxykeywords_KeywordCaller_Throws(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Transient() {
	C.cproxykeywords_KeywordCaller_Transient(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) True() {
	C.cproxykeywords_KeywordCaller_True(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Try() {
	C.cproxykeywords_KeywordCaller_Try(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Void() {
	C.cproxykeywords_KeywordCaller_Void(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Volatile() {
	C.cproxykeywords_KeywordCaller_Volatile(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) While() {
	C.cproxykeywords_KeywordCaller_While(C.int32_t(p.Bind_proxy_refnum__()))
}

//export proxykeywords__Const
func proxykeywords__Const(param_id C.nstring) {
	_param_id := decodeString(param_id)
	keywords.Const(_param_id)
}

//export proxykeywords__Static
func proxykeywords__Static(param_strictfp C.nstring) {
	_param_strictfp := decodeString(param_strictfp)
	keywords.Static(_param_strictfp)
}
