.size"
	//
	// Optional
	//
	// NOTE: FFI_USE_Size MUST be set to true to make this field effective.
	Size int32

	FFI_USE_Ttl     bool // for Ttl.
	FFI_USE_Timeout bool // for Timeout.
	FFI_USE_Size    bool // for Size.

	FFI_USE bool
}

// FromRef calls UpdateFrom and returns a SendPacketOptions with all fields set.
func (p SendPacketOptions) FromRef(ref js.Ref) SendPacketOptions {
	p.UpdateFrom(ref)
	return p
}

// New creates a new SendPacketOptions in the application heap.
func (p SendPacketOptions) New() js.Ref {
	return bindings.SendPacketOptionsJSLoad(
		js.Pointer(&p), js.True, 0,
	)
}

// UpdateFrom copies value of all fields of the heap object to p.
func (p *SendPacketOptions) UpdateFrom(ref js.Ref) {
	bindings.SendPacketOptionsJSStore(
		js.Pointer(p), ref,
	)
}

// Update writes all fields of the p to the heap object referenced by ref.
func (p *SendPacketOptions) Update(ref js.Ref) {
	bindings.SendPacketOptionsJSLoad(
		js.Pointer(p), js.False, ref,
	)
}

// FreeMembers frees fields with heap reference, if recursive is true
// free all heap references reachable from p.
func (p *SendPacketOptions) FreeMembers(recursive bool) {
	js.Free(
		p.Ip.Ref(),
	)
	p.Ip = p.Ip.FromRef(js.Undefined)
}

// HasFuncSendPacket returns true if the function "WEBEXT.diagnostics.sendPacket" exists.
func HasFuncSendPacket() bool {
	return js.True == bindings.HasFuncSendPacket()
}

// FuncSendPacket returns the function "WEBEXT.diagnostics.sendPacket".
func FuncSendPacket() (fn js.Func[func(options SendPacketOptions) js.Promise[SendPacketResult]]) {
	bindings.FuncSendPacket(
		js.Pointer(&fn),
	)
	return
}

// SendPacket calls the function "WEBEXT.diagnostics.sendPacket" directly.
func SendPacket(options SendPacketOptions) (ret js.Promise[SendPacketResult]) {
	bindings.CallSendPacket(
		js.Pointer(&ret),
		js.Pointer(&options),
	)

	return
}

// TrySendPacket calls the function "WEBEXT.diagnostics.sendPacket"
// in a try/catch block and returns (_, err, ok = false) when it went through
// the catch clause.
func TrySendPacket(options SendPacketOptions) (ret js.Promise[SendPacketResult], exception js.Any, ok bool) {
	ok = js.True == bindings.TrySendPacket(
		js.Pointer(&ret), js.Pointer(&exception),
		js.Pointer(&options),
	)

	return
}
// SPDX-License-Identifier: Apache-2.0
// Copyright 2023 The Prime Citizens

package brailledisplayprivate

import (
	"github.com/primecitizens/pcz/std/core/abi"
	"github.com/primecitizens/pcz/std/core/mark"
	"github.com/primecitizens/pcz/std/ffi/js"
	"github.com/primecitizens/pcz/std/plat/js/webext/brailledisplayprivate/bindings"
)

type DisplayState struct {
	// Available is "DisplayState.available"
	//
	// Optional
	//
	// NOTE: FFI_USE_Available MUST be set to true to make this field effective.
	Available bool
	// TextRowCount is "DisplayState.textRowCount"
	//
	// Optional
	//
	// NOTE: FFI_USE_TextRowCount MUST be set to true to make this field effective.
	TextRowCount int32
	// TextCo


win)
            if selected_line_in_ui then
                pcall(vim.api.nvim_win_set_cursor, main_ui_win, { selected_line_in_ui, 0 })
            end
        end
        state.disable_auto_close = old_disable_auto_close
        notify.info(state.lang.PROJECT_SWITCHED_TO .. selected_project.name)
    end
    if state.workspace_id and state.tab_active then
        vim.api.nvim_create_autocmd({ "BufEnter", "WinEnter" }, {
            group = space_restore_augroup,
            callback = function()
                vim.api.nvim_clear_autocmds({ group = space_restore_augroup })
                vim.schedule(final_ui_update_and_notify)
            end,
            once = true,
        })
        session.restore_state(state.tab_active, true)
    else
        session.clear_current_state()
        vim.schedule(final_ui_update_and_notify)
    end
end

local function enter_navigate_next(project_id)
    local selected_project = data.find_project_by_id(project_id)
    if not selected_project then
        notify.error(state.lang.PROJECT_NOT_FOUND)
        return
    end
    local path_to_check = selected_project.path
    if vim.fn.isdirectory(path_to_check) ~= 1 then
        notify.error(state.lang.DIRECTORY_NOT_FOUND .. ": " .. path_to_check)
        return
    end
    if not utils.has_permission(path_to_check) then
        notify.error(state.lang.DIRECTORY_NOT_ACCESS .. ": " .. path_to_check)
        return
    end
    if state.tab_active then
        session.save_current_state(state.tab_active, true)
    end
    local success_chdir, error_msg_chdir = pcall(vim.api.nvim_set_current_dir, path_to_check)
    if not success_chdir then
        notify.error(
            (state.lang.CHANGE_DIRECTORY_FAILED or "Failed to change directory to %s"):format(path_to_check)
                .. " Error: "
                .. tostring(error_msg_chdir)
        )
        return
    end
    state.project_id = project_id
    set_active_workspace_for_project(project_id)
    state.disable_auto_close = true
    ui.close_all()
    notify.info(state.lang.PROJECT_SWITCHED_TO .. selected_project.name)
    vim.schedule(function()
        local target_init_func
        if state.workspace_id and state.tab_active then
            session.restore_state(state.tab_active, true)
            target_init_func = require("lvim-space.ui.files").init
        elseif state.workspace_id then
            target_init_func = require("lvim-space.ui.tabs").init
        else
            target_init_func = function()
                require("lvim-space.ui.workspaces").init(nil, { select_workspace = false })
            end
        end
        -- vim.defer_fn(function()
        state.disable_auto_close = false
        if target_init_func then
            target_init_func()
        end
        -- end, 100)
    end)
end

local function handle_move_operation(ctx, direction)
    if not ctx or not ctx.win or not vim.api.nvim_win_is_valid(ctx.win) then
        return
    end
    local current_visual_line = vim.api.nvim_win_get_cursor(ctx.win)[1]
    local project_id_to_move = cache.project_ids_map[current_visual_line]
    if not project_id_to_move then


0

.thumb
branch_22611f0: @ 22611f0 :thumb
	add     r1, r4, r6
	add     r1, #0xc0
	str     r0, [r1, #0x0]
	bl      Function_201d35c
	mov     r1, r4
	add     r1, #0xcc
	ldrb    r1, [r1, #0x0]
	blx     _u32_div_f
	ldr     r0, [sp, #0x8]
	strb    r1, [r0, r5]
.thumb
branch_2261208: @ 2261208 :thumb
	mov     r1, r4
	mov     r0, #0x14
	add     r1, #0x7c
	mul     r0, r5
	add     r0, r1, r0
	add     r1, r4, r6
	add     r1, #0xc0
	ldr     r1, [r1, #0x0]
	bl      Function_2017240
.thumb
branch_226121c: @ 226121c :thumb
	add     sp, #0xc
	pop     {r4-r7,pc}
@ 0x2261220

.thumb
Function_2261220: @ 2261220 :thumb
	push    {r4-r6,lr}
	mov     r4, r2
	mov     r6, r0
	mov     r5, r1
	cmp     r4, #0x3
	blt     branch_2261230
	bl      ErrorHandling
.thumb
branch_2261230: @ 2261230 :thumb
	ldrh    r0, [r5, #0x2]
	cmp     r0, #0x12
	bcc     branch_226123a
	bl      ErrorHandling
.thumb
branch_226123a: @ 226123a :thumb
	ldrh    r1, [r5, #0x2]
	mov     r0, #0xc
	mul     r0, r1
	add     r1, r6, r0
	lsl     r0, r4, #2
	add     r1, r1, r0
	mov     r0, #0xef
	lsl     r0, r0, #2
	ldr     r0, [r1, r0]
	cmp     r0, #0x0
	beq     branch_2261288
	mov     r6, r5
	add     r6, #0xb8
	ldrb    r0, [r6, r4]
	cmp     r0, #0x1
	bne     branch_2261288
	mov     r2, r5
	mov     r1, #0x14
	add     r2, #0x7c
	mul     r1, r4
	add     r0, r5, #0x4
	add     r1, r2, r1
	bl      Function_2017288
	lsl     r2, r4, #2
	mov     r0, #0x0
	add     r1, r5, r2
	strb    r0, [r6, r4]
	add     r1, #0xc0
	str     r0, [r1, #0x0]
	add     r1, r5, r4
	add     r1, #0xbc
	strb    r0, [r1, #0x0]
	add     r1, r5, r4
	add     r1, #0xcd
	strb    r0, [r1, #0x0]
	add     r1, r5, r2
	add     r1, #0xd0
	str     r0, [r1, #0x0]
.thumb
branch_2261288: @ 2261288 :thumb
	pop     {r4-r6,pc}
@ 0x226128a

.align 2, 0

.thumb
Function_226128c: @ 226128c :thumb
	push    {r4-r6,lr}
	mov     r6, r0
	mov     r5


            String interviewEmployeeName = "无";
            String transOldInterviewEmployeeName = LanguageFieldEnum.ACTIONRECORD_EMPTY.getFieldFormat();
            String transInterviewEmployeeName = LanguageFieldEnum.ACTIONRECORD_EMPTY.getFieldFormat();
            if (null != hrmRecruitInterview.getInterviewEmployeeId()) {
                HrmEmployee oldInterviewEmployee = employeeService.getById(hrmRecruitInterview.getInterviewEmployeeId());
                if (oldInterviewEmployee != null) {
                    oldInterviewEmployeeName = oldInterviewEmployee.getEmployeeName();
                    transOldInterviewEmployeeName = oldInterviewEmployeeName;
                }
            }
            if (null != interview.getInterviewEmployeeId()) {
                HrmEmployee interviewEmployee = employeeService.getById(interview.getInterviewEmployeeId());
                if (interviewEmployee != null) {
                    interviewEmployeeName = interviewEmployee.getEmployeeName();
                    transInterviewEmployeeName = interviewEmployeeName;
                }
            }
            if (!oldInterviewEmployeeName.equals(interviewEmployeeName)) {
                content.append("，面试官：" + "从").append(oldInterviewEmployeeName).append("更改为").append(interviewEmployeeName);
            }
            if (!transOldInterviewEmployeeName.equals(transInterviewEmployeeName)) {
                transContent.append("，").append(HrmLanguageEnum.INTERVIEW_METHOD.getFieldFormat()).append("：").append("   ").append(transOldInterviewEmployeeName).append(LanguageFieldEnum.ACTIONRECORD_UPDATE.getFieldFormat()).append(transInterviewEmployeeName);
            }

            StringBuilder oldOtherInterviewEmployeeName = new StringBuilder();
            StringBuilder otherInterviewEmployeeName = new StringBuilder();
            Set<Long> oldEmployeeIds = TagUtil.toLongSet(hrmRecruitInterview.getOtherInterviewEmployeeIds());
            Set<Long> employeeIds = TagUtil.toLongSet(interview.getOtherInterviewEmployeeIds());
            if (CollectionUtil.isNotEmpty(oldEmployeeIds)) {
                oldEmployeeIds.forEach(employeeId -> {
                    HrmEmployee employee = employeeService.getById(employeeId);
                    //判断员工不存在 || 删除 || 已离职
                    if (employee.getIsDel() == 1 || employee.getEntryStatus() == EmployeeEntryStatus.ALREADY_LEAVE.getValue()) {
                        throw new CrmException(HrmCodeEnum.EMPLOYEE_NO_EXIST, employee.getEmployeeName());
                    }
                    oldOtherInterviewEmployeeName.append(employee.getEmployeeName()).append("、");
                });
            }
            if (CollectionUtil.isNotEmpty(employeeIds)) {
                employeeIds.forEach(employeeId -> {
                    HrmEmployee employee = employeeService.getById(employeeId);
                    //判断员工不存在 || 删除 || 已离职
                    if (employee.getIsDel() == 1 || employee.getEntryStatus() == EmployeeEntryStatus.ALREADY_LEAVE.getValue()) {
                        throw new CrmException(HrmCodeEnum.EMPLOYEE_NO_EXIST, employee.getEmployeeName());
                    }
                    otherInterviewEmployeeName.append(employee.getEmployeeName()).append("、");
                });
            }
            if (CollectionUtil.isNotEmpty(employeeIds) && CollectionUtil.isNotEmpty(oldEmployeeIds) && !TagUtil.isSetEqual(oldEmployeeIds, employeeIds)) {
                content.append("，其他面试官：" + "从").append(oldOtherInterviewEmployeeName.deleteCharAt(oldOtherInterviewEmployeeName.length() - 1)).append("更改为").append(otherInterviewEmployeeName.deleteCh


pdate, &countDelete,
			&timeFetch, &timeInsert, &timeUpdate, &timeDelete,
		); err != nil {
			return err
		}
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsDesc, prometheus.CounterValue, float64(countFetch),
			objectSchema, objectName, "fetch",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsDesc, prometheus.CounterValue, float64(countInsert),
			objectSchema, objectName, "insert",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsDesc, prometheus.CounterValue, float64(countUpdate),
			objectSchema, objectName, "update",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsDesc, prometheus.CounterValue, float64(countDelete),
			objectSchema, objectName, "delete",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsTimeDesc, prometheus.CounterValue, float64(timeFetch)/picoSeconds,
			objectSchema, objectName, "fetch",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsTimeDesc, prometheus.CounterValue, float64(timeInsert)/picoSeconds,
			objectSchema, objectName, "insert",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsTimeDesc, prometheus.CounterValue, float64(timeUpdate)/picoSeconds,
			objectSchema, objectName, "update",
		)
		ch <- prometheus.MustNewConstMetric(
			performanceSchemaTableWaitsTimeDesc, prometheus.CounterValue, float64(timeDelete)/picoSeconds,
			objectSchema, objectName, "delete",
		)
	}
	return nil
}

// check interface
var _ Scraper = ScrapePerfTableIOWaits{}
// Copyright 2018 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Scrape `information_schema.client_statistics`.

package collector

import (
	"context"
	"database/sql"
	"fmt"
	"strings"

	"github.com/prometheus/client_golang/prometheus"
)

const clientStatQuery = `SELECT * FROM information_schema.client_statistics`

var (
	// Map known client-statistics values to types. Unknown types will be mapped as
	// untyped.
	informationSchemaClientStatisticsTypes = map[string]struct {
		vtype prometheus.ValueType
		desc  *prometheus.Desc
	}{
		"TOTAL_CONNECTIONS": {prometheus.CounterValue,
			prometheus.NewDesc(prometheus.BuildFQName(namespace, informationSchema, "client_statistics_total_connections"),
				"The number of connections created for this client.",
				[]string{"client"}, nil)},
		"CONCURRENT_CONNECTIONS": {prometheus.GaugeValue,
			prometheus.NewDesc(prometheus.BuildFQName(namespace, informationSchema, "client_statistics_concurrent_connections"),
				"The number of concurrent connections for this client.",
				[]string{"client"}, nil)},
		"CONNECTED_TIME": {prometheus.CounterValue,
			prometheus.NewDesc(prometheus.BuildFQName(namespace, informationSchema, "client_statistics_connected_time_seconds_total"),
				"The cumulative number of seconds elapsed while there were connections from this client.",
				[]string{"client"}, nil)},
		"BUSY


C;一次编译 gcc 的时候 /tools/include/limits.h 并不存在，因此 GCC 安装的内部头文件只是部分的自包含文件， 并不包括系统头文件的扩展功能。这足以编译临时 libc，但是这次编译 GCC 要求完整的内部头文件。 使用和正常情况下 GCC 编译系统使用的相同的命令创建一个完整版本的内部头文件：

cd $LFS/sources
# 清理上次源代码目录
rm -rf gcc-7.3.0
tar xf gcc-7.3.0.tar.xz
cd gcc-7.3.0

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

再一次更改 GCC 的默认动态链接器的位置，使用安装在 /tools 的那个

for file in gcc/config/{linux,i386/linux{,64}}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

在x86_64上编译，需要将默认&#x76


nd,block-start,block-end,block-size,inline-size",ie_id:"csslogicalpropertieslevel1",chrome_id:"",firefox_id:"",webkit_id:"",shown:!0}},{}],102:[function(n,e,y){e.exports={title:"CSS Masks",description:"Method of displaying part of an element, using a selected image as a mask",spec:"https://www.w3.org/TR/css-masking-1/",status:"cr",links:[{url:"https://www.webplatform.org/docs/css/properties/mask",title:"WebPlatform Docs"},{url:"https://www.html5rocks.com/en/tutorials/masking/adobe/",title:"HTML5 Rocks article"},{url:"http://thenittygritty.co/css-masking",title:"Detailed blog post"},{url:"https://bugzilla.mozilla.org/show_bug.cgi?id=1224422",title:"Firefox implementation bug"},{url:"http://lab.iamvdo.me/css-svg-masks",title:"Visual test cases"}],bugs:[],categories:["CSS"],stats:{ie:{5.5:"n",6:"n",7:"n",8:"n",9:"n",10:"n",11:"n"},edge:{12:"n",13:"n",14:"n",15:"n",16:"n",17:"n"},firefox:{2:"n",3:"n",3.5:"a #2",3.6:"a #2",4:"a #2",5:"a #2",6:"a #2",7:"a #2",8:"a #2",9:"a #2",10:"a #2",11:"a #2",12:"a #2",13:"a #2",14:"a #2",15:"a #2",16:"a #2",17:"a #2",18:"a #2",19:"a #2",20:"a #2",21:"a #2",22:"a #2",23:"a #2",24:"a #2",25:"a #2",26:"a #2",27:"a #2",28:"a #2",29:"a #2",30:"a #2",31:"a #2",32:"a #2",33:"a #2",34:"a #2",35:"a #2",36:"a #2",37:"a #2",38:"a #2",39:"a #2",40:"a #2",41:"a #2",42:"a #2",43:"a #2",44:"a #2",45:"a #2",46:"a #2",47:"a #2",48:"a #2",49:"a #2",50:"a #2",51:"a #2",52:"a #2",53:"y",54:"y",55:"y",56:"y",57:"y",58:"y",59:"y",60:"y"},chrome:{4:"a x #1",5:"a x #1",6:"a x #1",7:"a x #1",8:"a x #1",9:"a x #1",10:"a x #1",11:"a x #1",12:"a x #1",13:"a x #1",14:"a x #1",15:"a x #1",16:"a x #1",17:"a x #1",18:"a x #1",19:"a x #1",20:"a x #1",21:"a x #1",22:"a x #1",23:"a x #1",24:"a x #1",25:"a x #1",26:"a x #1",27:"a x #1",28:"a x #1",29:"a x #1",30:"a x #1",31:"a x #1",32:"a x #1",33:"a x #1",34:"a x #1",35:"a x #1",36:"a x #1",37:"a x #1",38:"a x #1",39:"a x #1",40:"a x #1",41:"a x #1",42:"a x


		isNonstandard: null,
		gen: 1,
		basePower: 75,
		pp: 10,
	},
	petalblizzard: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
	},
	leafblade: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		basePower: 90,
	},
	woodhammer: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		recoil: [25, 100],
		desc: "If the target lost HP, the user takes recoil damage equal to 1/4 the HP lost by the target, rounded down, but not less than 1 HP. If this move breaks the target's substitute, the user does not take any recoil damage.",
		shortDesc: "Has 1/4 recoil.",
	},
	poisonjab: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		secondary: {
			chance: 40,
			status: 'psn',
		},
		desc: "Has a 40% chance to poison the target.",
		shortDesc: "40% chance to poison the target.",
	},
	gunkshot: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		accuracy: 80,
		secondary: {
			chance: 40,
			status: 'psn',
		},
		desc: "Has a 40% chance to poison the target.",
		shortDesc: "40% chance to poison the target.",
	},
	poisonfang: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		secondary: {
			chance: 40,
			status: 'psn',
		},
		desc: "Has a 40% chance to poison the target.",
		shortDesc: "40% chance to poison the target.",
	},
	sludgewave: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		pp: 15,
	},
	silverwind: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
	},
	bugbuzz: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		secondary: {
			chance: 33,
			boosts: {
				spd: -1,
				spa: -1,
			},
		},
		desc: "Has a 33% chance to lower the target's Special by 1 stage.",
		shortDesc: "33% chance to lower the target's Special by 1.",
	},
	megahorn: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
	},
	xscissor: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
	},
	signalbeam: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
	},
	earthpower: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		secondary: {
			chance: 33,
			boosts: {
				spd: -1,
				spa: -1,
			},
		},
		desc: "Has a 33% chance to lower the target's Special by 1 stage.",
		shortDesc: "33% chance to lower the target's Special by 1.",
	},
	mudslap: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		secondary: {
			chance: 33,
			boosts: {
				accuracy: -1,
			},
		},
		desc: "Has a 33% chance to lower the target's Accuracy by 1 stage.",
		shortDesc: "33% chance to lower the target's Accuracy by 1.",
	},
	mudbomb: {
		inherit: true,
		isNonstandard: null,
		gen: 1,
		secondary: {
			chance: 33,
			boost


.3164ZM4 24H34C35.1046 24 36 24.8954 36 26V30C36 31.1046 35.1046 32 34 32H4C2.89543 32 2 31.1046 2 30V26C2 24.8954 2.89543 24 4 24ZM0 26C0 23.7909 1.79086 22 4 22H34C36.2091 22 38 23.7909 38 26V30C38 32.2091 36.2091 34 34 34V48C34 50.2091 32.2091 52 30 52H8C5.79086 52 4 50.2091 4 48L4 34C1.79086 34 0 32.2091 0 30V26ZM6 34V48C6 49.1046 6.89543 50 8 50H30C31.1046 50 32 49.1046 32 48V34H6ZM13 38C13 37.4477 13.4477 37 14 37H24C24.5523 37 25 37.4477 25 38C25 38.5523 24.5523 39 24 39H14C13.4477 39 13 38.5523 13 38Z' fill='%23162B40'/%3E%3C/svg%3E%0A");
}

.jet-woo-builder-icon-category-description:before {
	background-image: url("data:image/svg+xml,%3Csvg width='38' height='47' viewBox='0 0 38 47' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6 26V12H32V26C32 27.1046 31.1046 28 30 28H8C6.89543 28 6 27.1046 6 26ZM14 15C13.4477 15 13 15.4477 13 16C13 16.5523 13.4477 17 14 17H24C24.5523 17 25 16.5523 25 16C25 15.4477 24.5523 15 24 15H14Z' fill='white'/%3E%3Cpath d='M0 4C0 1.79086 1.79086 0 4 0H34C36.2091 0 38 1.79086 38 4V8C38 10.2091 36.2091 12 34 12H4C1.79086 12 0 10.2091 0 8V4Z' fill='%236F8BFF'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M4 2H34C35.1046 2 36 2.89543 36 4V8C36 9.10457 35.1046 10 34 10H4C2.89543 10 2 9.10457 2 8V4C2 2.89543 2.89543 2 4 2ZM0 4C0 1.79086 1.79086 0 4 0H34C36.2091 0 38 1.79086 38 4V8C38 10.2091 36.2091 12 34 12V26C34 28.2091 32.2091 30 30 30H8C5.79086 30 4 28.2091 4 26L4 12C1.79086 12 0 10.2091 0 8V4ZM6 12V26C6 27.1046 6.89543 28 8 28H30C31.1046 28 32 27.1046 32 26V12H6ZM13 16C13 15.4477 13.4477 15 14 15H24C24.5523 15 25 15.4477 25 16C25 16.5523 24.5523 17 24 17H14C13.4477 17 13 16.5523 13 16ZM1 37C0.447715 37 0 37.4477 0 38C0 38.5523 0.447716 39 1 39H37C37.5523 39 38 38.5523 38 38C38 37.4477 37.5523 37 37 37H1ZM1 41C0.447715 41 0 41.4477 0 42C0 42.5523 0.447716 43 1 43H37C37.5523 43 38 42.5523 38 42C38 41.4477 37.5523 41


---
-- A class to handle all shop requirements
-- @author ZenBre4ker
-- @class Shop

shop = shop or {}

shop.favorites = shop.favorites or {}
shop.favorites.databaseName = "ttt2_shop_favorites"

---
-- Looks for equipment id in favorites table
-- @param number equipmentId id of the @{WEAPON} or @{ITEM}
-- @return boolean
-- @realm client
function shop.IsFavorite(equipmentId)
    return shop.favorites.orm:Find(equipmentId) ~= nil
end

---
-- Get all favorites of the LocalPlayer
-- @return table list of all favorites
-- @realm client
function shop.GetFavorites()
    return shop.favorites.orm:All()
end

---
-- Adds a @{WEAPON} or an @{ITEM} into the fav table
-- @param string equipmentId the @{WEAPON} or @{ITEM} id
-- @param boolean isFavorite If the equipmentId is a favorite
-- @realm client
function shop.SetFavoriteState(equipmentId, isFavorite)
    local favOrm


&& obj.text == this.text;
		}

		public override int GetHashCode()
		{
			return text.GetHashCode() ^ operation.GetHashCode();
		}
	}

	/**
	 * Class representing one patch operation.
	 */
	public class Patch
	{
		public List<Diff> diffs = new List<Diff>();
		public int start1;
		public int start2;
		public int length1;
		public int length2;

		/**
		 * Emmulate GNU diff's format.
		 * Header: @@ -382,8 +481,9 @@
		 * Indicies are printed as 1-based, not 0-based.
		 * @return The GNU diff string.
		 */
		public override string ToString()
		{
			string coords1, coords2;
			if (this.length1 == 0)
			{
				coords1 = this.start1 + ",0";
			}
			else if (this.length1 == 1)
			{
				coords1 = Convert.ToString(this.start1 + 1);
			}
			else
			{
				coords1 = (this.start1 + 1) + "," + this.length1;
			}
			if (this.length2 == 0)
			{
				coords2 = this.start2 + ",0";
			}
			else if (this.length2 == 1)
			{
				coords2 = Convert.ToString(this.start2 + 1);
			}
			else
			{
				coords2 = (this.start2 + 1) + "," + this.length2;
			}
			StringBuilder text = new StringBuilder();
			text.Append("@@ -").Append(coords1).Append(" +").Append(coords2)
				.Append(" @@\n");
			// Escape the body of the patch with %xx notation.
			foreach (Diff aDiff in this.diffs)
			{
				switch (aDiff.operation)
				{
					case Operation.INSERT:
						text.Append('+');
						break;
					case Operation.DELETE:
						text.Append('-');
						break;
					case Operation.EQUAL:
						text.Append(' ');
						break;
				}

				text.Append(diff_match_patch.UrlEncode(aDiff.text).Replace('+', ' ')).Append("\n");
			}

			return diff_match_patch.unescapeForEncodeUriCompatability(
				text.ToString());
		}
	}

	/**
	 * Class containing the diff, match and patch methods.
	 * Also Contains the behaviour settings.
	 */
	public class diff_match_patch
	{
		// Defaults.
		// Set these on your diff_match_patch instance to override the defaults.

		// Number of seconds to map a diff before giving up (0 for infinity).
		public float Diff_Timeout = 1.0f;
		// Cost of an empty edit operation in terms of edit characters.
		public short Diff_EditCost = 4;
		// At what point is no match declared (0.0 = perfection, 1.0 = very loose).
		public float Match_Threshold = 0.5f;
		// How far to search for a match (0 = exact location, 1000+ = broad match).
		// A match this many characters away from the expected location will add
		// 1.0 to the score (0.0 is a perfect match).
		public int Match_Distance = 1000;
		// When deleting a large block of text (over ~64 characters), how close
		// do the contents have to be to match the expected contents. (0.0 =
		// perfection, 1.0 = very loose).  Note that Match_Threshold controls
		// how closely the end points of a delete need to match.
		public float Patch_DeleteThreshold = 0.5f;
		// Chunk size for context length.
		public short Patch_Margin = 4;

		// The number of bits in an int.
		private short Match_MaxBits = 32;

		//  DIFF FUNCTIONS

		/**
		 * Find the differences between two texts.
		 * Run a faster, slightly less optimal diff.
		 * This method allows the 'checklines' of diff_main() to be optional.
		 * Most of the time checklines is wanted, so default to true.
		 * @param text1 Old string to be diffed.
		 * @param text2 New string to be diffed.
		 * @return List of Diff objects.


/*
 * testmain.c: A sample source to show how to use mcpp as a subroutine.
 * 2006/11  Contributed by Juergen Mueller.
 * Refer to mcpp-porting.html section 3.12 for compiling mcpp as a subroutine.
 *
 * 2007/03  Updated to enable testing of memory buffer output.
 * 2008/04  The macro MCPP_LIB is no longer necessary.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "mcpp_lib.h"

int main(int argc, char *argv[])
{
    int     i, j;
    char ** tmp_argv;

    tmp_argv = (char **) malloc(sizeof(char *) * (argc + 1));

    if (tmp_argv == NULL) {
        return(0);
    }

    /*
     * assume strict order: <options, ...> <files, ...> and
     * each option and its argument are specified without intervening spaces
     * such as '-I/dir' or '-otmp.i' (not '-I /dir' nor '-o tmp.i').
     */
    for (i = 0; i < argc; ++i) {
        tmp_argv[i] = argv[i];              /* copy options */

        if (       (*argv[i] != '-')
                && (*argv[i] != '/')
                && (i > 0)) {
            break;
        }
    }

    /* this works only if called function does not manipulate pointer array! */
    /*
     * Note that mcpp no longer uses freopen() since 2008/04/20, so you can
     * output multiple input to different files, though this sample output
     * to stdout, which may be redirected.
     */
    for (j = i; i < argc; ++i) {
        int     retval;
        char *  result;
        clock_t start, finish;

        tmp_argv[j] = argv[i];              /* process each file    */
        fprintf(stderr, "\n%s\n", argv[i]);

        start = clock();                    /* get start time       */
#if OUT2MEM         /* Use memory buffer    */
        mcpp_use_mem_buffers( 1);           /* enable memory output */
        retval = mcpp_lib_main(j + 1, tmp_argv);    /* call MCPP    */
        result = mcpp_get_mem_buffer( OUT); /* get the output       */
        if (result)
            fputs( result, stdout);
        result = mcpp_get_mem_buffer( ERR); /* get the diagnostics  */
        if (result)
            fputs( result, stderr);
#if 0   /* debug output is the same with normal output by default   */
        result = mcpp_get_mem_buffer( DBG); /* get the debug output */
        if (result)
            fputs( result, stdout);         /* appended to output   */
#endif
#else               /* Normal output to file    */
        retval = mcpp_lib_main(j + 1, tmp_argv);
#endif
        finish = clock();                   /* get finish time      */

        fprintf(stderr, "\nReturned status:%d, Elapsed time: %.3f seconds.\n",
                retval, (double)(finish - start) / (double)CLOCKS_PER_SEC);
    }

    free(tmp_argv);

    return(0);
}


.server, volume.nfs.path)),
    ])
  elif volume.csi:
    if volume.csi.driver == 'gcsfuse.run.googleapis.com':
      bucket = None
      for prop in volume.csi.volumeAttributes.additionalProperties:
        if prop.key == 'bucketName':
          bucket = prop.value
      return cp.Labeled(
          [('name', name), ('type', 'cloud-storage'), ('bucket', bucket)]
      )

def GetVolumes(record):
  """Returns a print mapping for volumes."""
  volumes = {v.name: _FormatVolume(v) for v in record.spec.volumes}
  volumes = {k: v for k, v in volumes.items() if v}
  return cp.Mapped(k8s_util.OrderByKey(volumes))

def _FormatVolume(volume):
  """Format a volume for the volumes list."""
  if volume.emptyDir:
    return cp.Labeled([
        ('type', 'in-memory'),
        ('size-limit', volume.emptyDir.sizeLimit),
    ])
  elif volume.nfs:
    return cp.Labeled([
        ('type', 'nfs'),
        ('location', '{}:{}'.format(volume.nfs.server, volume.nfs.path)),
        ('read-only', volume.nfs.readOnly),
    ])
  elif volume.csi:
    if volume.csi.driver == 'gcsfuse.run.googleapis.com':
      bucket = None
      for prop in volume.csi.volumeAttributes.additionalProperties:
        if prop.key == 'bucketName':
          bucket = prop.value
      return cp.Labeled([
          ('type', 'cloud-storage'),
          ('bucket', bucket),
          ('read-only', volume.csi.readOnly),
      ])

def GetConfigMaps(container: container_resource.Container) -> cp.Table:
  """Returns a print mapping for env var and volume-mounted config maps."""
  config_maps = {}
  config_maps.update(
      {
          k: _FormatConfigMapKeyRef(v)
          for k, v in container.env_vars.config_maps.items()
      }
  )
  config_maps.update(
      {
          k: _FormatConfigMapVolumeSource(v)
          for k, v in container.MountedVolumeJoin('config_maps').items()
      }
  )
  return cp.Mapped(k8s_util.OrderByKey(config_maps))


```
apiVersion: "envoy.solo.io/v1alpha1"
kind: "Envoy"
metadata:
  name: "myingress"
spec:
  ...
  nodeIdTemplate: "{{.PodName}}"
```

The node id given to each Envoy will match its pod name.

The full template interpolation interface is defined [here](pkg/downward/interface.go) and should cover all of the downward API (labels and annotations included).

# Use cases
This operator's main uses case is with an ADS-enabled [xDS  server](https://github.com/envoyproxy/data-plane-api/blob/master/XDS_PROTOCOL.md) [such as Gloo](https://github.com/solo-io/gloo). We are looking to hear more from the community about what other uses cases are of interest.

# Road Map
- SSL \ mTLS configuration
- Pod Injection
- Provide Locality information for zone aware routing.
- Hot Restarts

# Help
Please join us on our slack channel [https://slack.solo.io/](https://slack.solo.io/) with any questions, feedback, or suggestions.
---
title: "Operator Architecture"
description: "Overvriew of the Architecture of Operators built with Autopilot"
weight: 3
---

The architecture of Autopilot Operators is determined by Autopilot and enforced in generated code. While generated code can be manually modified to customize this architecture, it is not currently recommended.

To better understand the architecture of an Autopilot Operator,
let's use the [Example Canary Operator](https://github.com/solo-io/autopilot/tree/master/test/e2e) as an example.

Consider the following diagram of our Canary. The Canary Operator has the following architecture:

{{<mermaid align="left">}}
 graph LR;

    subgraph legend
    userDefined[User-Defined Code]
    generated[Generated Code]
    k8s[Imported Kubernetes Libraries]
    end

    subgraph Canary Operator
    w1[Initializing
Worker]-->|scheduled when
Canary CRD
 is in Initializing phase|s[Canary Scheduler]
    w2[Waiting
Worker]-->|scheduled when
Canary CRD
 is in Waiting phase|s
    w3[Evaluating
Worker]-->|scheduled when
Canary CRD
 is in Evaluating phase|s
    w4[Promoting
Worker]-->|scheduled when
Canary CRD
 is in Promoting phase|s
    w5[Rollback
Worker]-->|scheduled when
Canary CRD
 is in Rollback phase|s
    s-->|Scheduler is called
by Manager on
CRD change or input output event|m[Manager]
    spec[Canary API Spec]-->|Watch Canary API Types|c[Kubernetes API Client]
    c-->|communcation with Kubernetes API|m
    end

   classDef userDefined fill:#0DDF00,stroke:#233,stroke-width:4px;
   class w1,w2,w3,w4,w5,spec,userDefined userDefined;
   classDef generated fill:#fae100,stroke:#233,stroke-width:4px;
   class s,generated generated;
   classDef k8s fill:#eb7b26,stroke:#233,stroke-width:4px;
   class m,c,k8s k8s;

{{< /mermaid >}}

For reference, code for each component can be found in the following table:

Component               | Source Code | Location
------------------------|-------------|-----
Initializing Worker     | [initializing/worker.go](https://github.com/solo-io/autopilot/blob/master/test/e2e/canary/pkg/workers/initializing/worker.go) | User Project (user-defined)
Waiting Worker          | [waiting/worker.go](https://github.com/solo-io/autopilot/blob/master/test/e2e/canary/pkg/workers/waiting/worker.go) | User Project


-sm dib va-t">

Transportation
Key Democrats pledge support for more federal aid for transit

Economic Policy
Trump threatens executive actions as coronavirus relief deal remains elusiv...

Education
America is about to start online learning, Round 2. For millions of student...

Transportation
<a href="/transportation/2020/08/05/more-than-dozen


ibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_


>

   {% extends "generator/base.html" %}
{% load static %}
{% load markdownify %}

{% block title %}Resumo Estratégico de PDF para Concursos{% endblock title %}

{% block extra_head %}
    <style>
        .summary-container {
            background-color: var(--bs-tertiary-bg);
            padding: 1.5rem;
            border-radius: 0.375rem;
            margin-top: 1.5rem;
            border: 1px solid var(--bs-border-color-translucent);
        }
        .summary-text-markdown {
            font-size: 0.95em;
            line-height: 1.6;
            background-color: var(--bs-body-bg);
            padding: 1rem;
            border-radius: 0.25rem;
            border: 1px solid var(--bs-border-color);
        }
        .summary-text-markdown h1,
        .summary-text-markdown h2,
        .summary-text-markdown h3,
        .summary-text-markdown h4,
        .summary-text-markdown h5,
        .summary-text-markdown h6 {
            margin-top: 1.2em;
            margin-bottom: 0.6em;
            font-weight: 600;
            color: var(--bs-body-color); /* Garante que a cor do texto seja visível na impressão */
        }
        .summary-text-markdown h5 {
             margin-top: 0;
        }
        .summary-text-markdown p {
            margin-bottom: 0.8em;
             color: var(--bs-body-color);
        }
        .summary-text-markdown ul,
        .summary-text-markdown ol {
            padding-left: 1.8em;
            margin-bottom: 1em;
             color: var(--bs-body-color);
        }
        .summary-text-markdown li {
            margin-bottom: 0.4em;
        }
        .summary-text-markdown strong {
            font-weight: 600;
        }
        .form-label-strong {
            font-weight: 500;
        }

        /* --- ESTILOS PARA IMPRESSÃO --- */
        @media print {
            body {
                font-family: 'Times New Roman', Times, serif; /* Fonte serifada para impressão */
                font-size: 12pt; /* Tamanho de fonte comum para impressão */
                color: #000000 !important; /* Garante texto preto */
                background-color: #ffffff !important; /* Fundo branco */
            }

            /* Esconde elementos desnecessários na impressão */
            header.fixed-top, /* Barra de navegação */
            footer, /* Rodapé */
            .btn, /* Todos os botões */
            .alert, /* Alertas */
            .card, /* O card do formulário de upload */
            #decrease-font, #reset-font, #increase-font, /* Controles de fonte */
            .bd-mode-toggle, /* Seletor de tema */
            .lead, /* Parágrafo introdutório */
            hr, /* Linhas horizontais, se houver fora do conteúdo principal */
            .container > h1 /* O título principal da página, se desejar esconder */
             {
                display: none !important;
            }

            /* Garante que o conteúdo do resumo seja visível e ocupe a página */
            .summary-container {
                border: none !important;
                box-shadow: none !important;
                padding: 0 !important;
                margin: 0 !important;
                background-color: #ffffff !important;
            }

            .summary-text-markdown {
                border: none !important;
                padding: 0 !important;
                background-color: #ffffff !important;
                max-height: none !important; /* Remove altura máxima */
                overflow-y: visible !important; /* Remove scroll */
            }

            .summary-text-markdown a { /* Estilo para links na impressão */
                text-decoration: underline;


/*
 * net/drivers/team/team_mode_roundrobin.c - Round-robin mode for team
 * Copyright (c) 2011 Jiri Pirko <jpirko@redhat.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/netdevice.h>
#include <linux/if_team.h>

struct rr_priv {
	unsigned int sent_packets;
};

static struct rr_priv *rr_priv(struct team *team)
{
	return (struct rr_priv *) &team->mode_priv;
}

static struct team_port *__get_first_port_up(struct team *team,
					     struct team_port *port)
{
	struct team_port *cur;

	if (port->linkup)
		return port;
	cur = port;
	list_for_each_entry_continue_rcu(cur, &team->port_list, list)
		if (cur->linkup)
			return cur;
	list_for_each_entry_rcu(cur, &team->port_list, list) {
		if (cur == port)
			break;
		if (cur->linkup)
			return cur;
	}
	return NULL;
}

static bool rr_transmit(struct team *team, struct sk_buff *skb)
{
	struct team_port *port;
	int port_index;

	port_index = rr_priv(team)->sent_packets++ % team->port_count;
	port = team_get_port_by_index_rcu(team, port_index);
	if (unlikely(!port))
		goto drop;
	port = __get_first_port_up(team, port);
	if (unlikely(!port))
		goto drop;
	skb->dev = port->dev;
	if (dev_queue_xmit(skb))
		return false;
	return true;

drop:
	dev_kfree_skb_any(skb);
	return false;
}

static int rr_port_enter(struct team *team, struct team_port *port)
{
	return team_port_set_team_mac(port);
}

static void rr_port_change_mac(struct team *team, struct team_port *port)
{
	team_port_set_team_mac(port);
}

static const struct team_mode_ops rr_mode_ops = {
	.transmit		= rr_transmit,
	.port_enter		= rr_port_enter,
	.port_change_mac	= rr_port_change_mac,
};

static struct team_mode rr_mode = {
	.kind		= "roundrobin",
	.owner		= THIS_MODULE,
	.priv_size	= sizeof(struct rr_priv),
	.ops		= &rr_mode_ops,
};

static int __init rr_init_module(void)
{
	return team_mode_register(&rr_mode);
}

static void __exit rr_cleanup_module(void)
{
	team_mode_unregister(&rr_mode);
}

module_init(rr_init_module);
module_exit(rr_cleanup_module);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Jiri Pirko <jpirko@redhat.com>");
MODULE_DESCRIPTION("Round-robin mode for team");
MODULE_ALIAS("team-mode-roundrobin");


background-color: var(--ctp-crust) !important;
}

.yt-spec-button-shape-next--call-to-action-inverse.yt-spec-button-shape-next--text {
  color: var(--ctp-accent) !important;
}

ytmusic-guide-entry-renderer {
  color: var(--ctp-accent) !important;
}

ytmusic-guide-entry-renderer[active] tp-yt-paper-item.ytmusic-guide-entry-renderer {
  background-color: var(--ctp-base) !important;
}

ytmusic-app[is-bauhaus-sidenav-enabled] #guide-wrapper.ytmusic-app {
  background: var(--ctp-mantle) !important;
  border: none !important;
}

#divider.ytmusic-guide-section-renderer {
  border: none !important;
}

.title.ytmusic-guide-entry-renderer {
  color: var(--ctp-text) !important;
}

.yt-spec-button-shape-next--mono.yt-spec-button-shape-next--tonal {
  color: var(--ctp-text) !important;
  background-color: var(--ctp-base) !important;
}

ytmusic-guide-entry-renderer:not([is-primary]) .subtitle.ytmusic-guide-entry-renderer {
  color: var(--ctp-text) !important;
}

ytmusic-guide-renderer[is-collapsed] {
  background: var(--ctp-mantle) !important;
}

yt-start-at-renderer.yt-third-party-network-section-renderer {
  padding-top: 0 !important;
  border-top: none !important;
}

yt-formatted-string.yt-start-at-renderer {
  color: var(--ctp-text) !important;
}

#checkbox.tp-yt-paper-checkbox {
  border-color: var(--ctp-text) !important;
}

#checkbox.checked.tp-yt-paper-checkbox {
  background-color: var(--ctp-text) !important;
}

.unfocused-line.tp-yt-paper-input-container {
  border-bottom: none !important;
}

ytmusic-player-page[is-mweb-modernization-enabled][player-page-ui-state=TABS_VIEW] #side-panel.ytmusic-player-page {
  background: var(--ctp-base) !important;
}

ytmusic-player-page[is-mweb-modernization-enabled] .side-panel.ytmusic-player-page {
  background: var(--ctp-base) !important;
}

ytmusic-player-page[is-mweb-modernization-enabled][player-page-ui-state=TABS_VIEW] #main-panel.ytmusic-player-page {
  background: var(--ctp-base) !important;
}

.content-info-wrapper.ytmusic-player-bar .byline.ytmusic-player-bar {
  color: var(--ctp-accent) !important;
}

.title.ytmusic-player-controls {
  color: var(--ctp-text) !important;
}

.byline.ytmusic-player-controls {
  color: var(--ctp-accent) !important;
}

.play-pause-button-wrapper.ytmusic-player-controls {
  background: var(--ctp-mantle) !important;
}

#primaryProgress.tp-yt-paper-progress {
  background-color: var(--ctp-accent) !important;
}

#secondaryProgress.tp-yt-paper-progress {
  background-color: var(--ctp-crust) !important;
}

#progressContainer.tp-yt-paper-progress,
.indeterminate.


"c++11"}}))
    end)

package("ftxui")
    set_homepage("https://github.com/ArthurSonzogni/FTXUI")
    set_description(":computer: C++ Functional Terminal User Interface. :heart:")
    set_license("MIT")

    add_urls("https://github.com/ArthurSonzogni/FTXUI/archive/refs/tags/$(version).tar.gz",
             "https://github.com/ArthurSonzogni/FTXUI.git")
    add_versions("v5.0.0", "a2991cb222c944aee14397965d9f6b050245da849d8c5da7c72d112de2786b5b")
    add_versions("v4.1.1", "9009d093e48b3189487d67fc3e375a57c7b354c0e43fc554ad31bec74a4bc2dd")
    add_versions("v3.0.0", "a8f2539ab95caafb21b0c534e8dfb0aeea4e658688797bb9e5539729d9258cc1")

    add_deps("cmake")

    if is_plat("windows") then
        add_configs("shared", {description = "Build shared library.", default = false, type = "boolean", readonly = true})
    elseif is_plat("linux", "bsd") then
        add_syslinks("pthread")
    end

    add_links("ftxui-component", "ftxui-dom", "ftxui-screen")
    set_installdir(path.join(os.projectdir(), '3rd', 'ftxui', os.host()))

    on_install("linux", "windows", "macosx", "bsd", "mingw", "cross", function (package)
        local configs = {"-DFTXUI_BUILD_DOCS=OFF", "-DFTXUI_BUILD_EXAMPLES=OFF"}
        table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))
        table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
        import("package.tools.cmake").install(package, configs)
    end)

    on_test(function (package)
        assert(package:check_cxxsnippets({test = [[
            #include <memory>
            #include <string>

            #include "ftxui/component/captured_mouse.hpp"
            #include "ftxui/component/component.hpp"
            #include "ftxui/component/component_base.hpp"
            #include "ftxui/component/screen_interactive.hpp"
            #include "ftxui/dom/elements.hpp"

            using namespace ftxui;

            void test() {
                int value = 50;
                auto buttons = Container::Horizontal({
                  Button("Decrease", [&] { value--; }),
                  Button("Increase", [&] { value++; }),
                });
                auto component = Renderer(buttons, [&] {
                return vbox({
                           text("value = " + std::to_string(value)),
                           separator(),
                           gauge(value * 0.01f),
                           separator(),
                           buttons->Render(),
                       }) |
                       border;
                });
                auto screen = ScreenInteractive::FitComponent();
                screen.Loop(component);
            }
        ]]}, {configs = {languages = "c++17"}}))
    end)


ile = "meteorite cavern.ogg", mode = LOOP};
tr3_new_track_tbl[027] = {file = "steady.ogg", mode = LOOP};
tr3_new_track_tbl[028] = {file = "28_Antarctica.ogg", mode = LOOP};
tr3_new_track_tbl[029] = {file = "29_Things.ogg", mode = LOOP};
tr3_new_track_tbl[030] = {file = "30_Anyone_There.ogg", mode = LOOP};
tr3_new_track_tbl[031] = {file = "31_Grotto.ogg", mode = LOOP};
tr3_new_track_tbl[032] = {file = "32_On_The_Beach.ogg", mode = LOOP};
tr3_new_track_tbl[033] = {file = "33_Gamma_Pals.ogg", mode = LOOP};
tr3_new_track_tbl[034] = {file = "34_In_The_Jungle.ogg", mode = LOOP};
tr3_new_track_tbl[035] = {file = "35_Piranha_Waters.ogg", mode = LOOP};
tr3_new_track_tbl[036] = {file = "36_The_Rapids.ogg", mode = LOOP};
tr3_new_track_tbl[037] = {file = "37_Supper_Time.ogg", mode = ONCE};
tr3_new_track_tbl[038] = {file = "look out pt 5.ogg", mode = ONCE};
tr3_new_track_tbl[039] = {file = "looky pt 1.ogg", mode = ONCE};
tr3_new_track_tbl[040] = {file = "around the corner 5.ogg", mode = ONCE};
tr3_new_track_tbl[041] = {file = "seeing is believing 2.ogg", mode = ONCE};
tr3_new_track_tbl[042] = {file = "stone the crows 9.ogg", mode = ONCE};
tr3_new_track_tbl[043] = {file = "look out 8.ogg", mode = ONCE};
tr3_new_track_tbl[044] = {file = "look out 4.ogg", mode = ONCE};
tr3_new_track_tbl[045] = {file = "stone crows 7.ogg", mode = ONCE};
tr3_new_track_tbl[046] = {file = "stone crows 3.ogg", mode = ONCE};
tr3_new_track_tbl[047] = {file = "stone crows 8.ogg", mode = ONCE};
tr3_new_track_tbl[048] = {file = "looky here 2.ogg", mode = ONCE};
tr3_new_track_tbl[049] = {file = "stone crows 4.ogg", mode = ONCE};
tr3_new_track_tbl[050] = {file = "stone crows 6.ogg", mode = ONCE};
tr3_new_track_tbl[051] = {file = "look out 3.ogg", mode = ONCE};
tr3_new_track_tbl[052] = {file = "look out 1.ogg", mode = ONCE};
tr3_new_track_tbl[053] = {file = "there be butterflies here 1.ogg", mode = ONCE};
tr3_new_track_tbl[054] = {file = "stone crows 1.ogg", mode = ONCE};
tr3_new_track_tbl[055] = {file = "stone crows 5.ogg", mode = ONCE};
tr3_new_track_tbl[056] = {file = "mind the gap 1.ogg", mode = ONCE};
tr3_new_track_tbl[057] = {file = "butteflies 5.ogg", mode = ONCE};
tr3_new_track_tbl[058] = {file = "look out 2.ogg", mode = ONCE};
tr3_new_track_tbl[059] = {file = "look out 7.ogg", mode = ONCE};
tr3_new_track_tbl[060] = {file = "stone the crows 2.ogg", mode = ONCE};
tr3_new_track_tbl[061] = {file = "look out 6.ogg", mode = ONCE};
tr3_new_track_tbl[062] = {file = "


l43.58 46.67 10.23 10.96 63.42 67.93c2.42 2.59.89 6.41-2.91 7.27Z"
        fill="#00c27a"
      ></path>
      <circle fill="#00c27a" r="22.5" cy="230.47" cx="300.735"></circle>
      <circle fill="#e53950" r="22.5" cy="220.148" cx="294.064"></circle>
      <path
        d="m259.605 9.741 9.885 20.03a4.02 4.02 0 0 0 3.027 2.199l22.104 3.212a4.02 4.02 0 0 1 2.228 6.857l-15.994 15.59a4.02 4.02 0 0 0-1.157 3.559l3.776 22.014a4.02 4.02 0 0 1-5.833 4.238l-19.77-10.393a4.02 4.02 0 0 0-3.742 0L234.36 87.44a4.02 4.02 0 0 1-5.833-4.238l3.776-22.014a4.02 4.02 0 0 0-1.157-3.558l-15.994-15.591a4.02 4.02 0 0 1 2.228-6.857l22.104-3.212a4.02 4.02 0 0 0 3.027-2.2l9.885-20.029a4.02 4.02 0 0 1 7.21 0Z"
        fill="#fac600"
      ></path>
      <path
        d="M280.306 346.9a22.489 22.489 0 0 1-21.054 36.785 22.497 22.497 0 1 0 21.054-36.785zm17.678-149.073a22.489 22.489 0 0 1-21.053 36.785 22.497 22.497 0 1 0 21.053-36.785zM190.39 296.445a22.489 22.489 0 0 1-21.053 36.785 22.497 22.497 0 1 0 21.053-36.785z"
        fill="#ca2e43"
      ></path>
      <path
        d="M230.246 73.174c1.094.087 2.196.144 3.313.144a41.522 41.522 0 0 0 41.514-40.977l-2.556-.371a4.02 4.02 0 0 1-3.027-2.2l-9.885-20.029a4.02 4.02 0 0 0-7.21 0l-9.885 20.03a4.02 4.02 0 0 1-3.027 2.199l-22.104 3.212a4.02 4.02 0 0 0-2.228 6.857l15.994 15.59a4.02 4.02 0 0 1 1.157 3.559Z"
        fill="#fed402"
      ></path>
      <path
        d="M309.005 172.364a7.5 7.5 0 1 0-7.5-7.5 7.5 7.5 0 0 0 7.5 7.5Zm32.787 98.632a7.5 7.5 0 1 0-7.5-7.5 7.5 7.5 0 0 0 7.5 7.5ZM446.57 380.73l-62.034-66.442q13.352-2.477 26.572-5.46a13.958 13.958 0 0 0 10.554-9.38 12.65 12.65 0 0 0-2.97-12.46l-65.432-70.08q11.608-2.098 23.033-4.678a12.637 12.637 0 0 0 9.411-8.412 11.461 11.461 0 0 0-2.68-11.294L288.414 91.19a11.435 11.435 0 0 0 2.451-9.258l-3.467-20.212 14.686-14.314a11.52 11.52 0 0 0-6.385-19.65l-20.2


词记录
        String guessesJson = stringRedisTemplate.opsForValue().get(
                DrawGameRedisKey.getKey(DrawGameRedisKey.ROOM_GUESSES, roomId));
        if (guessesJson == null) {
            return new ArrayList<>();
        }

        try {
            return objectMapper.readValue(guessesJson, new TypeReference<List<DrawGuessVO>>() {
            });
        } catch (JsonProcessingException e) {
            log.error("解析猜词记录失败", e);
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "获取猜词记录失败");
        }
    }

    @Override
    public boolean startGame(String roomId) {
        // 验证参数
        if (StringUtils.isBlank(roomId)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "房间ID不能为空");
        }

        // 验证用户登录状态
        User loginUser = userService.getLoginUser();

        // 使用分布式锁确保并发安全
        RLock lock = redissonClient.getLock("draw_room_start_lock:" + roomId);
        try {
            boolean isLocked = lock.tryLock(5, 10, TimeUnit.SECONDS);
            if (!isLocked) {
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "操作频繁，请稍后再试");
            }

            // 获取房间信息
            String roomJson = stringRedisTemplate.opsForValue().get(
                    DrawGameRedisKey.getKey(DrawGameRedisKey.ROOM_INFO, roomId));
            if (roomJson == null) {
                throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "房间不存在");
            }

            try {
                DrawRoom room = objectMapper.readValue(roomJson, DrawRoom.class);

                // 检查是否为房主
                if (!loginUser.getId().equals(room.getCreatorId()) && !UserConstant.ADMIN_ROLE.equals(loginUser.getUserRole())) {
                    throw new BusinessException(ErrorCode.NO_AUTH_ERROR, "只有房主或管理员可以开始游戏");
                }

                // 检查房间状态
                if (room.getStatus() != RoomStatusEnum.WAITING) {
                    throw new BusinessException(ErrorCode.OPERATION_ERROR, "房间已结束无法观战");
                }

                // 检查参与者数量
                if (room.getParticipantIds().size() < 2) {
                    throw new BusinessException(ErrorCode.OPERATION_ERROR, "参与者数量不足，至少需要2人");
                }

                // 更新房间状态
                room.setStatus(RoomStatusEnum.PLAYING);
                room.setStartTime(new Date());
                room.setRoundEndTime(System.currentTimeMillis() / 1000 + room.getRoundDuration());
                room.setCorrectGuessIds(new HashSet<>());
                room.setCurrentRound(1);

                // 根据房间模式设置绘画者
                if (Boolean.TRUE.equals(room.getCreatorOnlyMode())) {
                    // 房主绘画模式，绘画者始终为房主
                    room.setCurrentDrawerId(room.getCreatorId());
                } else {
                    // 轮换模式，如果当前绘画者为空，默认设置为房主
                    if (room.getCurrentDrawerId() == null) {
                        room.setCurrentDrawerId(room.getCreatorId());
                    }
                }

                // 更新房间信息
                String updatedRoomJson = objectMapper.writeValueAsString(room);
                stringRedisTemplate.opsForValue().set(
                        DrawGameRedisKey.getKey(DrawGameRedisKey.ROOM_INFO, roomI


indowIcon':
                    #title = win32gui.GetWindowText(hwnd)
                    #if title == 'MEmu':
                    left, top, right, bottom = win32gui.GetWindowRect(hwnd)
                    h = bottom - top
                    if h > 780:
                        Thwnd = hwnd
                        break
            except:
                pass

        if Thwnd != -1:
            left, top, right, bottom = win32gui.GetWindowRect(Thwnd)
            print('发现安卓窗口，hwnd:', hex(Thwnd), ' 窗口：', str(left) + " " +
            str(top) + " " +   str(right) + " " + str(bottom) + ' w= ' + str(right-left)
            + " h= " + str(bottom - top))
            self._hwndMain = Thwnd

            """
            # FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None);
            Thwnd = win32gui.FindWindowEx(Thwnd,0,'Qt5QWindowIcon', 'MainWindowWindow')

            # 安卓主窗口home键窗口
            hwndHome = self.get_child_windows(Thwnd)
            for hwnd in hwndHome:
                className = win32gui.GetClassName(hwnd)
                if className ==  'Qt5QWindowIcon':
                    left, top, right, bottom = win32gui.GetWindowRect(hwnd)
                    w = right - left
                    if w == 36:
                        print('发现安卓Home键窗口，hwnd:', hex(hwnd), ' 窗口：', str(left) + " " +
                        str(top) + " " +   str(right) + " " + str(bottom) + ' w= ' + str(right-left)
                         + " h= " + str(bottom - top))
                        self._hwndMainButton = hwnd

            Thwnd = win32gui.FindWindowEx(Thwnd,0,'Qt5QWindowIcon','CenterWidgetWindow')
            Thwnd = win32gui.FindWindowEx(Thwnd,0,'Qt5QWindowIcon','RenderWindowWindow')
            Thwnd = win32gui.FindWindowEx(Thwnd,0,'subWin','sub')
            Thwnd = win32gui.FindWindowEx(Thwnd,0,'subWin','sub')
            left, top, right, bottom = win32gui.GetWindowRect(Thwnd)
            print('发现安卓窗口，hwnd:', hex(Thwnd), ' 窗口：', str(left) + " " +
            str(top) + " " +   str(right) + " " + str(bottom) + ' w= ' + str(right-left)
            + " h= " + str(bottom - top))
            self._hwndMain = Thwnd
            """
        else:
            print("未发现安卓窗口")

    def get_child_windows(self,parent):
        '''
        获得parent的所有子窗口句柄
        返回子窗口句柄列表
        '''
        #if not parent:
        #    return
        hwndChildList = []
        win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd),  hwndChildList)
        return hwndChildList


using System;

namespace Mirror
{
    /// <summary>
    /// Provides profiling information from mirror
    /// A profiler can subscribe to these events and
    /// present the data in a friendly way to the user
    /// </summary>
    public static class NetworkDiagnostics
    {
        /// <summary>
        /// Describes an outgoing message
        /// </summary>
        public readonly struct MessageInfo
        {
            /// <summary>
            /// The message being sent
            /// </summary>
            public readonly IMessageBase message;
            /// <summary>
            /// channel through which the message was sent
            /// </summary>
            public readonly int channel;
            /// <summary>
            /// how big was the message (does not include transport headers)
            /// </summary>
            public readonly int bytes;
            /// <summary>
            /// How many connections was the message sent to
            /// If an object has a lot of observers this count could be high
            /// </summary>
            public readonly int count;

            internal MessageInfo(IMessageBase message, int channel, int bytes, int count)
            {
                this.message = message;
                this.channel = channel;
                this.bytes = by


splay mode": "Display mode", "Spotify v1": "Spotify v1", "Import Spotify playlists up to 100 tracks without any login.": "Import Spotify playlists up to 100 tracks without any login.", "Download imported tracks": "Download imported tracks", "Start import": "Start import", "Spotify v2": "Spotify v2", "Import any Spotify playlist, import from own Spotify library. Requires free account.": "Import any Spotify playlist, import from own Spotify library. Requires free account.", "Spotify Importer v2": "Spotify Importer v2", "This importer requires Spotify Client ID and Client Secret. To obtain them:": "This importer requires Spotify Client ID and Client Secret. To obtain them:", "1. Go to: developer.spotify.com/dashboard and create an app.": "1. Go to: developer.spotify.com/dashboard and create an app.", "Open in Browser": "Open in Browser", "2. In the app you just created go to settings, and set the Redirect URL to: ": "2. In the app you just created go to settings, and set the Redirect URL to: ", "Copy the Redirect URL": "Copy the Redirect URL", "Client ID": "Client ID", "Client Secret": "Client Secret", "Authorize": "Authorize", "Logged in as: ": "Logged in as: ", "Import playlists by URL": "Import playlists by URL", "URL": "URL", "Options": "Options", "Invalid/Unsupported URL": "Invalid/Unsupported URL", "Please wait...": "Please wait...", "Login using email": "Login using email", "Track removed from offline!": "Track removed from offline!", "Removed album from offline!": "Removed album from offline!", "Playlist removed from offline!": "Playlist removed from offline!", "Repeat": "Repeat", "Repeat one": "Repeat one", "Repeat off": "Repeat off", "Love": "Love", "Unlove": "Unlove", "Dislike": "Dislike", "Close": "Close", "Sort playlist": "Sort playlist", "Sort ascending": "Sort ascending", "Sort descending": "Sort descending", "Stop": "Stop", "Start": "Start", "Clear all": "Clear all", "Play previous": "Play previous", "Play": "Play", "Pause": "Pause", "Remove": "Remove", "Seekbar": "Seekbar", "Singles": "Singles", "Featured": "Featured", "Fans": "Fans", "Duration": "Duration", "Sort": "Sort", "Your ARL might be expired, try logging out and logging back in using new ARL or browser.": "Your ARL might be expired, try logging out and logging back in using new ARL or browser."}, "sk_sk": {"Home": "Domov", "Search": "Hľadať", "Library": "Knižnica", "Offline mode, can't play flow or smart track lists.": "Offline mód, nemôžete spustiť flow alebo smart track zoznam.", "Added to library": "Pridané do knižnice", "Download": "Stiahnuť", "Disk": "Disk", "Offline": "Offline", "Top Tracks": "Najlepšie skladby", "Show more tracks": "Zobraziť viac skladieb", "Top": "Najlepšie", "Top Albums": "Najlepšie albumy", "Show all albums": "Zobraziť všetky albumy", "Discography": "Diskografia", "Default": "Predvolené", "Reverse": "Opačne", "Alphabetic": "Abecedne", "Artist": "Umelec", "Post processing...": "Prebieha spracovanie...", "Done": "Hotovo", "Delete


 "បន្ថែមបន្ទាត់ផ្តេក",
InsertSpecialCharLbl: "អក្សរពិសេស",
InsertSpecialChar	: "បន្ថែមអក្សរពិសេស",
InsertSmileyLbl		: "រូបភាព",
InsertSmiley		: "បន្ថែម រូបភាព",
About				: "អំពី FCKeditor",
Bold				: "អក្សរដិតធំ",
Italic				: "អក្សរផ្តេក",
Underline			: "ដិតបន្ទាត់ពីក្រោមអក្សរ",
StrikeThrough		: "ដិតបន្ទាត់ពាក់កណ្តាលអក្សរ",
Subscript			: "អក្សរតូចក្រោម",
Superscript			: "អក្សរតូចលើ",
LeftJustify			: "តំរឹមឆ្វេង",
CenterJustify		: "តំរឹមកណ្តាល",
RightJustify		: "តំរឹមស្តាំ",
BlockJustify		: "តំរឹមសងខាង",
DecreaseIndent		: "បន្ថយការចូលបន្ទាត់",
IncreaseIndent		: "បន្ថែមការចូលបន្ទាត់",
Blockquote			: "Blockquote",	//MISSING
Undo				: "សារឡើងវិញ",
Redo				: "ធ្វើឡើងវិញ",
NumberedListLbl		: "បញ្ជីជាអក្សរ",
NumberedList		: "បន្ថែម/លប់ បញ្ជីជាអក្សរ",
BulletedListLbl		: "បញ្ជីជារង្វង់មូល",
BulletedList		: "បន្ថែម/លប់ បញ្ជីជារង្វង់មូល",
ShowTableBorders	: "បង្ហាញស៊ុមតារាង",
ShowDetails			: "បង្ហាញពិស្តារ",
Style				: "ម៉ូត",
FontFormat			: "រចនា",
Font				: "ហ្វុង",
FontSize			: "ទំហំ",
TextColor			: "ពណ៌អក្សរ",
BGColor				: "ពណ៌ផ្ទៃខាងក្រោយ",
Source				: "កូត",
Find				: "ស្វែងរក",
Replace				: "ជំ�


zeros(8760)
            df = pd.DataFrame(data, columns=['wind_farm'])
            return df

        csv_path = os.path.join(
            os.path.dirname(__file__), "..", "data", 'oedb')
        myTurbine = {
            'turbine_type': self.turbine_name,  # turbine type as in file
            'hub_height': self.hub_height,  # in m
            'rotor_diameter': self.rotor_diameter,  # in m
            'path': csv_path  # using power_curve csv
        }

        # initialise WindTurbine object
        siemens = WindTurbine(**myTurbine)

        # specification of wind farm data
        farm = {
            'name': 'example_farm',
            'wind_turbine_fleet': [
                {'wind_turbine': siemens,
                 'number_of_turbines': self.multiplier}],
            'efficiency': self.wind_farm_efficiency}

        # initialize WindFarm object
        farm_obj = WindFarm(**farm)

        weather = self.weather_data()

        # power output calculation for example_farm
        # initialize TurbineClusterModelChain with default parameters and use
        # run_model method to calculate power output
        mc_farm = TurbineClusterModelChain(farm_obj).run_model(weather)
        # write power output time series to WindFarm object
        farm_obj.power_output = mc_farm.power_output

        # units in kWh
        # times by 0.5 to correct for MEERA dataset
        series = (farm_obj.power_output * 0.5 / 1000).round(2)
        df = series.to_frame()
        df.columns = ['wind_farm']

        return df


ame);
        }

        const uint STGM_READ = 0;
        const int MAX_PATH = 260;

        // CLSID_ShellLink from ShlGuid.h
        [
            ComImport(),
            Guid("00021401-0000-0000-C000-000000000046")
        ]
        public class ShellLink
        {
        }

        #endregion

        public static string ResolveShortcut(string filename)
        {
            ShellLink link = new ShellLink();
            ((IPersistFile)link).Load(filename, STGM_READ);
            // TODO: if I can get hold of the hwnd call resolve first. This handles moved and renamed files.
            // ((IShellLinkW)link).Resolve(hwnd, 0)
            StringBuilder sb = new StringBuilder(MAX_PATH);
            WIN32_FIND_DATAW data = new WIN32_FIND_DATAW();
            ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0);
            return sb.ToString();
        }
    }
}


template-tag,
.vscode-light .hljs-template-variable,
.vscode-light .hljs-type {
	color: #a31515;
}

.vscode-light .hljs-subst,
.vscode-light .hljs-selector-attr,
.vscode-light .hljs-selector-pseudo,
.vscode-light .hljs-meta,
.vscode-light .hljs-meta-keyword {
	color: #2b91af;
}
.vscode-light .hljs-title,
.vscode-light .hljs-doctag {
	color: #808080;
}

.vscode-light .hljs-attr {
	color: #f00;
}

.vscode-light .hljs-symbol,
.vscode-light .hljs-bullet,
.vscode-light .hljs-link {
	color: #00b0e8;
}

.vscode-light .hljs-emphasis {
	font-style: italic;
}

.vscode-light .hljs-strong {
	font-weight: bold;
}
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

html {
	width: 100%;
	height: 100%;
	text-align: center;
}

body {
	padding: 5px 10px;
	width: calc(100% - 20px);
	height: calc(100% - 10px);
	display: flex;
	justify-content: center;
	align-items: center;
	-webkit-user-select: none;
	user-select: none;
}

.loading-indicator {
	width: 30px;
	height: 30px;
	background-image: url('./loading.svg');
	background-size: cover;
}

.loading-indicator,
.loading-error {
	display: none;
}

.loading .loading-indicator,
.error .loading-error {
	display: block;
}

.loading-error {
	margin: 1em;
}

.vscode-dark .loading-indicator {
	background-image: url('./loading-dark.svg');
}

.vscode-high-contrast .loading-indicator {
	background-image: url('./loading-hc.svg');
}
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

html {
	height: 100%;
}

body {
	box-sizing: border-box;
	min-height: 100%;
	margin: 0;
	padding: 15px 30px;
	display: flex;
	flex-direction: column;
	color: white;
	font-family: "Segoe UI","Helvetica Neue","Helvetica",Arial,sans-serif;
	background-color: #2C2C32;
}

.branding {
	background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAA


temp =1
for i in range(1,101):
    for j in range(2,i):
        if i%j==0:
            #print(f"{num} is not prime number")
            temp=1
            break
        else:
            #print(f"{num} is prime number")
            temp=0

    if temp==0:
        print(f"{i} is prime number")
    # else:
    #     print(f"{i} is prime number")


) {
    const g = _.groups,
          p = _.parent;
    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;
  }
  /**
   * Analyze items for overlap, changing opacity to hide items with
   * overlapping bounding boxes. This transform will preserve at least
   * two items (e.g., first and last) even if overlap persists.
   * @param {object} params - The parameters for this operator.
   * @param {function(*,*): number} [params.sort] - A comparator
   *   function for sorting items.
   * @param {object} [params.method] - The overlap removal method to apply.
   *   One of 'parity' (default, hide every other item until there is no
   *   more overlap) or 'greedy' (sequentially scan and hide and items that
   *   overlap with the last visible item).
   * @param {object} [params.boundScale] - A scale whose range should be used
   *   to bound the items. Items exceeding the bounds of the scale range
   *   will be treated as overlapping. If null or undefined, no bounds check
   *   will be applied.
   * @param {object} [params.boundOrient] - The orientation of the scale
   *   (top, bottom, left, or right) used to bound items. This parameter is
   *   ignored if boundScale is null or undefined.
   * @param {object} [params.boundTolerance] - The tolerance in pixels for
   *   bound inclusion testing (default 1). This specifies by how many pixels
   *   an item's bounds may exceed the scale range bounds and not be culled.
   * @constructor
   */

  function Overlap$1(params) {
    Transform.call(this, null, params);
  }

  const methods = {
    parity: items => items.filter((item, i) => i % 2 ? item.opacity = 0 : 1),
    greedy: (items, sep) => {
      let a;
      return items.filter((b, i) => !i || !intersect$1(a.bounds, b.bounds, sep) ? (a = b, 1) : b.opacity = 0);
    }
  }; // compute bounding box intersection
  // including padding pixels of separation

  const intersect$1 = (a, b, sep) => sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);

  const hasOverlap = (items, pad) => {
    for (var i = 1, n = items.length, a = items[0].bounds, b; i < n; a = b, ++i) {
      if (intersect$1(a, b = items[i].bounds, pad)) return true;
    }
  };

  const hasBounds = item => {
    const b = item.bounds;
    return b.width() > 1 && b.height() > 1;
  };

  const boundTest = (scale, orient, tolerance) => {
    var range = scale.range(),
        b = new Bounds();

    if (orient === Top$1 || orient === Bottom$1) {
      b.set(range[0], -Infinity, range[1], +Infinity);
    } else {
      b.set(-Infinity, range[0], +Infinity, range[1]);
    }

    b.expand(tolerance || 1);
    return item => b.encloses(item.bounds);
  }; // reset all items to be fully opaque

  const reset = source => {
    source.forEach(item => item.opacity = 1);
    return source;
  }; // add all tuples to mod, fork pulse if parameters were modified
  // fork prevents cross-stream tuple pollution (e.g., pulse from scale)

  const reflow = (pulse, _) => pulse.reflow(_.modified()).modifies('opacity');

  inherits(Overlap$1, Transform, {
    transform(_, pulse) {
      const reduce = methods[_.method] || methods.parity,
            sep = _.separation


iteTo(buffer[4..]);

		RandomNumberGenerator.Fill(buffer.Slice(length, n));

		return totalLength;
	}

	/// <returns>
	/// Parse 成功字节，0 则表示 Parse 失败
	/// </returns>
	public int TryParse(ReadOnlySpan<byte> buffer, ReadOnlySpan<byte> magicCookieAndTransactionId)
	{
		if (buffer.Length < 4)
		{
			return default;
		}

		Type = (AttributeType)BinaryPrimitives.ReadUInt16BigEndian(buffer);

		Length = BinaryPrimitives.ReadUInt16BigEndian(buffer[2..]);

		if (buffer.Length < 4 + Length)
		{
			return default;
		}

		ReadOnlySpan<byte> value = buffer.Slice(4, Length);

		IStunAttributeValue t = Type switch
		{
			AttributeType.MappedAddress => new MappedAddressStunAttributeValue(),
			AttributeType.XorMappedAddress => new XorMappedAddressStunAttributeValue(magicCookieAndTransactionId),
			AttributeType.ResponseAddress => new ResponseAddressStunAttributeValue(),
			AttributeType.ChangeRequest => new ChangeRequestStunAttributeValue(),
			AttributeType.SourceAddress => new SourceAddressStunAttributeValue(),
			AttributeType.ChangedAddress => new ChangedAddressStunAttributeValue(),
			AttributeType.OtherAddress => new OtherAddressStunAttributeValue(),
			AttributeType.ReflectedFrom => new ReflectedFromStunAttributeValue(),
			AttributeType.ErrorCode => new ErrorCodeStunAttributeValue(),
			_ => new UselessStunAttributeValue()
		};
		if (t.TryParse(value))
		{
			Value = t;
		}

		return 4 + Length + (4 - Length % 4) % 4; // 对齐
	}
}


.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package v1beta1

import (
	"log"
	"os"
	"testing"
	"time"

	"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/util/repo"

	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/rest"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/envtest"
)

var cfg *rest.Config
var c client.Client

func TestMain(m *testing.M) {
	t := &envtest.Environment{
		CRDDirectoryPaths:        []string{repo.GetCRDsPath()},
		ControlPlaneStartTimeout: time.Minute,
		ControlPlaneStopTimeout:  time.Minute,
	}

	err := SchemeBuilder.AddToScheme(scheme.Scheme)
	if err != nil {
		log.Fatal(err)
	}

	if cfg, err = t.Start(); err != nil {
		log.Fatal(err)
	}

	if c, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}); err != nil {
		log.Fatal(err)
	}

	code := m.Run()
	if err := t.Stop(); err != nil {
		log.Printf("unable to stop test runner: %v", err)
	}
	os.Exit(code)
}
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package v1alpha1

/* NOTYET - not yet needed
import (
	"context"
	"fmt"

	refsv1beta1 "github.com/GoogleCloudPlatform/k8s-config-connector/apis/refs/v1beta1"
	"github.com/GoogleCloudPlatform/k8s-config-connector/pkg/k8s"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/types"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

var _ refsv1beta1.ExternalNormalizer = &PolicyRef{}

// PolicyRef defines the resource reference to IAMDenyPolicy, which "External" field
// holds the GCP identifier for the KRM object.
type PolicyRef struct {
	// A reference to an externally managed IAMDenyPolicy resource.
	// Should be in the format "projects/{{projectID}}/locations/{{location}}/policys/{{policyID}}".
	External string `json:"external,omitempty"`

	// The name of a IAMDenyPolicy resource.
	Name string `json:"name,omitempty"`

	// The namespace of a IAMDenyPolicy resource.
	Namespace string `json:"namespace,omitempty"`
}

// NormalizedExternal provision the "External" value for other resource that depends on IAMDenyPolicy.
// If the "External" is given in the other resource's spec.IAMDenyPolicyRef, the given value will be used.
// Otherwise, the "Name" and "Namespace" will be used to query the actual IAMDenyPolicy object from the cluster.
func (r *PolicyRef) Normali


 = VM::default();
        b.iter(|| vm.interpret(black_box(src)));
    });
}

pub fn invocation(c: &mut Criterion) {
    let src = r#"
class Foo {
  method0() {} method1() {} method2() {} method3() {} method4() {} method5() {}
  method6() {} method7() {} method8() {} method9() {} method10() {} method11() {}
  method12() {} method13() {} method14() {} method15() {} method16() {} method17() {}
  method18() {} method19() {} method20() {} method21() {} method22() {} method23() {}
  method24() {} method25() {} method26() {} method27() {} method28() {} method29() {}
}

var foo = Foo();
var start = clock();
var i = 0;
while (i < 1000) {
  foo.method0(); foo.method1(); foo.method2(); foo.method3(); foo.method4(); foo.method5();
  foo.method6(); foo.method7(); foo.method8(); foo.method9(); foo.method10(); foo.method11();
  foo.method12(); foo.method13(); foo.method14(); foo.method15(); foo.method16(); foo.method17();
  foo.method18(); foo.method19(); foo.method20(); foo.method21(); foo.method22(); foo.method23();
  foo.method24(); foo.method25(); foo.method26(); foo.method27(); foo.method28(); foo.method29();
  i = i + 1;
}
"#;
    c.bench_function("invocation", |b| {
        let mut vm = VM::default();
        b.iter(|| vm.interpret(black_box(src)));
    });
}

pub fn method_call(c: &mut Criterion) {
    let src = r#"
class Toggle {
  init(startState) { this.state = startState; }
  value() { return this.state; }
  activate() {
    this.state = !this.state;
    return this;
  }
}
class NthToggle < Toggle {
  init(startState, maxCounter) {
    super.init(startState);
    this.countMax = maxCounter;
    this.count = 0;
  }
  activate() {
    this.count = this.count + 1;
    if (this.count >= this.countMax) {
      super.activate();
      this.count = 0;
    }
    return this;
  }
}
var n = 1000;
var val = true;
var toggle = Toggle(val);
for (var i = 0; i < n; i = i + 1) {
  val = toggle.activate().value(); val = toggle.activate().value(); val = toggle.activate().value();
  val = toggle.activate().value(); val = toggle.activate().value(); val = toggle.activate().value();
  val = toggle.activate().value(); val = toggle.activate().value(); val = toggle.activate().value();
  val = toggle.activate().value();
}
val = true;
var ntoggle = NthToggle(val, 3);
for (var i = 0; i < n; i = i + 1) {
  val = ntoggle.activate().value(); val = ntoggle.activate().value(); val = ntoggle.activate().value();
  val = ntoggle.activate().value(); val = ntoggle.activate().value(); val = ntoggle.activate().value();
  val = ntoggle.activate().value(); val = ntoggle.activate().value(); val = ntoggle.activate().value();
  val = ntoggle.activate().value();
}"#;
    c.bench_function("method_call", |b| {
        let mut vm = VM::default();
        b.iter(|| vm.interpret(black_box(src)));
    });
}

pub fn properties(c: &mut Criterion) {
    let src = r#"
class Foo {


10">

“诸比丘!此等是四种蛇。四者为何?即：出毒而非剧毒，剧毒而不出毒，出毒又是剧毒，不出毒又非剧毒是。诸比丘!此等是四种蛇。

诸比丘!正是如是，有此等四种蛇，应喻补特伽罗，存在于世中。四者为何?即：出毒而非剧毒，……乃至……不出毒又非剧毒是。

诸比丘!又，云何而有补特伽罗，出毒而非剧毒耶?诸比丘!世间有一类之补特伽罗，频发忿怒，然彼忿则不长续。诸比丘!有如是补特伽罗，出毒而非剧毒。诸比丘!犹如斯蛇，出毒而非剧毒。我说此补特伽罗，应如是喻。

诸比丘!又，云何而有补特伽罗，剧毒而不出毒耶?诸比丘!世间有一类之补特伽罗，不频频忿怒，然彼忿则长续。诸比丘!如是……乃至说……。

诸比丘!又，云何而有补特伽罗，出毒而又剧毒耶?诸比丘!世间有一类之补特伽罗，频频忿怒，彼忿又长续。诸比丘!如是……乃至说……。

诸比丘!又，云何而有补特伽罗，不出毒又非剧毒耶?诸比丘!世间有一类之补特伽罗，既不频频忿怒，彼毒又不长续。诸比丘!有如是之补特伽罗，既不出毒，又非剧毒。诸比丘!犹如斯蛇，不出毒又非剧毒。我说此补特伽罗，应如是喻。”

诸比丘!有此等四种蛇喻之补特伽罗，存在于世中。

注1 参阅Pug.IV.14.。

此之摄句

云1、瓶有二 湖水亦有二

庵罗、鼠、牛、树、蛇，此等有十。

注1 底本虽一如现译，于云之喻，有一零一、一零二两章。故正确当是：“二之云、瓶、湖水有二”之意义。而一章从阙。### 第三 无上品

#### 第21经 舍摩迦经

一时，世尊住释迦族舍摩迦之补迦罗尼耶。时，有一天女，于中夜有绝妙之色，偏照补迦罗尼耶，并诣世尊之处。至已，问讯世尊，立于一面。立于一面之彼天女白世尊言：“大德!此等三法，能令比丘退失。以何为三耶?即：好事�


using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.Events;

public class ColorPicker : MonoBehaviour
{
    private float _hue = 0;
    private float _saturation = 0;
    private float _brightness = 0;

    private float _red = 0;
    private float _green = 0;
    private float _blue = 0;

    private float _alpha = 1;

    public ColorChangedEvent onValueChanged = new ColorChangedEvent();
    public HSVChangedEvent onHSVChanged = new HSVChangedEvent();

    public Color CurrentColor
    {
        get
        {
            return new Color(_red, _green, _blue, _alpha);
        }
        set
        {
            if (CurrentColor == value)
                return;

            _red = value.r;
            _green = value.g;
            _blue = value.b;
            _alpha = value.a;

            RGBChanged();

            SendChangedEvent();
        }
    }

    private void Start()
    {
        SendChangedEvent();
    }

    public float H
    {
        get
        {
            return _hue;
        }
        set
        {
            if (_hue == value)
                return;

            _hue = value;

            HSVChanged();

            SendChangedEvent();
        }
    }

    public float S
    {
        get
        {
            return _saturation;
        }
        set
        {
            if (_saturation == value)
                return;

            _saturation = value;

            HSVChanged();

            SendChangedEvent();
        }
    }

    public float V
    {
        get
        {
            return _brightness;
        }
        set
        {
            if (_brightness == value)
                return;

            _brightness = value;

            HSVChanged();

            SendChangedEvent();
        }
    }

    public float R
    {
        get
        {
            return _red;
        }
        set
        {
            if (_red == value)
                return;

            _red = value;

            RGBChanged();

            SendChangedEvent();
        }
    }

    public float G
    {
        get
        {
            return _green;
        }
        set
        {
            if (_green == value)
                return;

            _green = value;

            RGBChanged();

            SendChangedEvent();
        }
    }

    public float B
    {
        get
        {


/* 002E0 8099F930 AC680004 */  sw      $t0, 0x0004($v1)           ## 00000004
.L8099F934:
/* 002E4 8099F934 3C06809A */  lui     $a2, %hi(D_8099FF34)       ## $a2 = 809A0000
/* 002E8 8099F938 24C6FF34 */  addiu   $a2, $a2, %lo(D_8099FF34)  ## $a2 = 8099FF34
/* 002EC 8099F93C 27A4003C */  addiu   $a0, $sp, 0x003C           ## $a0 = FFFFFEDC
/* 002F0 8099F940 02202825 */  or      $a1, $s1, $zero            ## $a1 = 00000000
/* 002F4 8099F944 0C031AD5 */  jal     func_800C6B54
/* 002F8 8099F948 24070159 */  addiu   $a3, $zero, 0x0159         ## $a3 = 00000159
/* 002FC 8099F94C 8FBF001C */  lw      $ra, 0x001C($sp)
/* 00300 8099F950 8FB00014 */  lw      $s0, 0x0014($sp)
/* 00304 8099F954 8FB10018 */  lw      $s1, 0x0018($sp)
/* 00308 8099F958 03E00008 */  jr      $ra
/* 0030C 8099F95C 27BD0160 */  addiu   $sp, $sp, 0x0160           ## $sp = 00000000


  val item = item()
            trail.draw(Tmp.c1.set(item.color).lerp(trailColor, 0.5f).a(item.color.a), trailWidth)
            Draw.z(z)
        }
    }
}package net.liplum.brain

import arc.audio.Sound
import arc.func.Prov
import arc.graphics.Color
import arc.graphics.g2d.Draw
import arc.graphics.g2d.Fill
import arc.graphics.g2d.Lines
import arc.math.Mathf
import arc.math.geom.Geometry
import arc.math.geom.Intersector
import arc.math.geom.Vec2
import arc.struct.EnumSet
import arc.util.Log
import arc.util.Time
import arc.util.io.Reads
import arc.util.io.Writes
import mindustry.Vars
import mindustry.ai.types.CommandAI
import mindustry.content.Fx
import mindustry.content.UnitTypes
import mindustry.entities.TargetPriority
import mindustry.game.EventType.TapEvent
import mindustry.gen.*
import mindustry.graphics.Layer
import mindustry.graphics.Pal
import mindustry.logic.LAccess
import mindustry.logic.Ranged
import mindustry.world.Block
import mindustry.world.blocks.ControlBlock
import mindustry.world.meta.BlockFlag
import mindustry.world.meta.BlockGroup
import mindustry.world.meta.Stat
import net.liplum.CioMod
import net.liplum.DebugOnly
import net.liplum.R
import net.liplum.Var
import net.liplum.annotations.Only
import net.liplum.annotations.SubscribeEvent
import net.liplum.api.IExecutioner
import net.liplum.api.brain.*
import net.liplum.common.delegate.Delegate
import net.liplum.common.entity.Radiation
import net.liplum.common.entity.RadiationQueue
import net.liplum.common.persistence.ReadFromCache
import net.liplum.common.persistence.WriteIntoCache
import net.liplum.common.util.format
import net.liplum.common.util.toDouble
import plumy.core.ClientOnly
import plumy.core.HeadlessOnly
import plumy.core.WhenNotPaused
import net.liplum.input.Inspector.isPlacing
import net.liplum.input.Inspector.isSelected
import net.liplum.input.smoothPlacing
import net.liplum.input.smoothSelect
import plumy.animation.Anime
import plumy.animation.ContextDraw.Draw
import plumy.animation.draw
import plumy.animation.linearFrames
import plumy.core.MUnit
import net.liplum.utils.atUnit
import net.liplum.utils.sheet
import net.liplum.utils.sub
import net.liplum.render.G
import net.liplum.render.HeatMeta
import net.liplum.render.Text
import net.liplum.render.drawHeat
import net.liplum.utils.addPowerUseStats
import plumy.core.Serialized
import plumy.core.assets.TR
import plumy.core.math.isZero
import plumy.core.math.pow2OutIntrp
import plumy.dsl.AddBar

/**
 * ### Since 1
 * - Heimdall's force field has stored current radius.
 * ### Since 2
 * - Using cache reader instead
 */
open class Heimdall(name: String) : Block(name) {
    @JvmField var range = 150f
    @JvmField var reloadTime = 60f
    @JvmField var waveSpeed = 2f
    @JvmField var waveWidth = 8f
    @JvmField var damage = 8f
    @JvmField var controlLine = 0.05f
    @JvmField var maxBrainWaveNum = 3
    @JvmField var forceFieldRegen = 3f
    @JvmField var forceFieldMax = 2000f
    @JvmField var forceFieldRadius = 50f
    @JvmField var forceFieldRadiusSpeed = 0.1f
    @JvmField var forceFieldRestoreTime = 200f
    @JvmField var powerUse = 2f
    /**
     * Cooling per tick. It should be multiplied by [Time.delta]
     */
    @JvmField var coolingSpeed = 0.


;right:auto;bottom:auto}.ui-pnotify.stack-custom-top{right:0;left:0;top:0}.ui-pnotify.stack-custom-bottom{right:0;left:0;bottom:0;top:auto}.ui-pnotify.ui-pnotify-in{display:block!important}.ui-pnotify.ui-pnotify-move{transition:left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-slow{opacity:0;transition:opacity linear .6s}.ui-pnotify.ui-pnotify-fade-slow.ui-pnotify.ui-pnotify-move{transition:opacity .6s linear,left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-normal{opacity:0;transition:opacity linear .4s}.ui-pnotify.ui-pnotify-fade-normal.ui-pnotify.ui-pnotify-move{transition:opacity .4s linear,left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-fast{transition:opacity .2s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-fast.ui-pnotify.ui-pnotify-move{transition:opacity .2s linear,left .5s ease,top .5s ease,right .5s ease,bottom .5s ease}.ui-pnotify.ui-pnotify-fade-in{opacity:1}.ui-pnotify-container{padding:.9375rem 1.25rem;height:100%;position:relative;left:0;margin:0;border-radius:.1875rem}.ui-pnotify-container::after{display:block;clear:both;content:""}.ui-pnotify-container.ui-pnotify-sharp{border-radius:0}.ui-pnotify-title{display:block;margin-top:0;margin-bottom:.3125rem;font-size:.9375rem}.ui-pnotify-text{display:block}.ui-pnotify-icon{display:block;float:left;line-height:1}.ui-pnotify-icon>[class^=icon-]{margin-top:.25003rem;margin-right:.625rem}.ui-pnotify-closer,.ui-pnotify-sticker{float:right;margin-left:.625rem;margin-top:.25003rem;line-height:1;outline:0}.ui-pnotify-modal-overlay{background-color:rgba(0,0,0,.5);top:0;left:0;position:absolute;z-index:1;width:100%;height:100%}body>.ui-pnotify-modal-overlay{position:fixed;z-index:1040}.brighttheme{border:1px solid}.ui-pnotify[class*=bg-]>.brighttheme{background-color:inherit;border-color:inherit;color:inherit}.brighttheme-notice{background-color:#fff3e0;border-color:#ff9800;color:#bf360c}.brighttheme-info{background-color:#e1f5fe;border-color:#03a9f4;color:#01579b}.brighttheme-success{background-color:#e8f5e9;border-color:#4caf50;color:#1b5e20}.brighttheme-error{background-color:#ffebee;border-color:#f44336;color:#b71c1c}.brighttheme-icon-closer,.brighttheme-icon-sticker{position:relative;display:inline-block;outline:0;width:.75rem;height:.75rem}.brighttheme-icon-closer:after,.brighttheme-icon-sticker:after{content:'';font-family:icomoon;font-size:.75rem;display:block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.brighttheme-icon-closer:after{content:"\ed6a"}.brighttheme-icon-sticker:after{content:"\ee70"}.brighttheme-icon-sticker.brighttheme-icon-stuck:after{content:"\ee75"}.ui-pnotify[class*=alert-styled


 task that can be run with `node merry_cemetery.js`.

The goal of this task is to obtain the content of a JavaScript variable, `aaaa`.
```
var aaaa = "HackTM{XXXXXXXXXXXXXXXXXXXXX-real-flag-on-remote-server}";
```

## Nobody likes web assembly

In order to understand what the web assembly file does, a tool has been used to
convert `wasm` to rust. This tool was found from a writeup of 36C3's web
assembly reverse task.

The main function is exported, which makes it possible to go to the main loop
quite easily.

The main loop first reads the user's input by calling `func_60`:
```rust
var_17 = func_60(); // read
var_18 = (var_17 << 24 >>s 24) - 36;
```

If the user's input is a `+`, it reads a joke and increments the local variable
at offset 24:
```rust
if var_18 == 7 { // +
    var_2 = load_8s<i32>(var_14 + 24);
    var_19 = load_8s<i32>(var_14 + 24);
    var_3 = func_62(var_19);

    if var_3 == 1 {
        var_20 = load_8s<i32>(var_14 + 24);
        var_7 = var_20 + 1 << 24 >>s 24;
        store_8<i32>(var_14 + 24, var_7) // var24++

        var_8 = load_8s<i32>(var_14 + 24);
        var_9 = load_8s<i32>(var_14 + 24) & 255;
        if var_9 == 255 {
            store<i32>(var_14 + 24, -1)
        }
    }
}
```

If the user's input is `$`, it will first check if the local variable at offset
24 is 255. (i.e. if 255 jokes have been submitted)

If it is, it will take a different path than the initial error:
```rust
if var_18 == 0 { // $
    var_23 = load_8s<i32>(var_14 + 24) & 255;
    if var_23 == 255 { // var24 == 255 ?
        var_24 = var_14 + 25;
        func_165(2, var_24, 1);
        var_25 = load_8s<i32>(var_14 + 25) & 255;
        func_65(var_25);
        env._exit(0);
    }
    else { // error
        var_26 = func_57(23724, 15016);
        var_27 = var_26;
        var_28 = 331;
        indirect_call((var_28 & 511) + 0)(var_27);
        env._exit(0);
    }
    return 0;
}
```

The program does behave differently after adding 255 jokes. The reward is to add
a longer joke to one's epitaph.

The joke is added by `func_65`:
```rust
var_3 = func_57(23724, 14848); // do to your kindness...
var_4 = 331;
indirect_call((var_4 & 511) + 0)(var_3);

var_5 = func_57(23724, 14970); // ++ Insert joke
var_6 = 331;
indirect_call((var_6 & 511) + 0)(var_5);

var_7 = func_166(0, 18144, arg_0); // probably a read
var_8 = func_64(var_7) != 0; // check joke
if var_8 {
    env._emscripten_run_script(18176);
    global_10 = var_1;
    return;
}

var_9 = func_57(23724, 14988); // Sorry quality jokes only
var_10 = 331;
indirect_call((var_10 & 511) + 0)(var_9);
global_10 = var_1;
return;
```

This function reads a joke, and calls `func_64` on it. If the function returns
0, the program will not consider the joke to be a "quality joke" and will exit.

```rust
var_13 = 0;
while true {
    if var_13 <s arg_0 - 1 == 0 {
        var_14 = 9; // good
        break;
    }

    var_15 = load_8s<i32>(18144 + var_13); // char[i]
    var_16 = var_15 << 24 >>s 24 >=s 98;
    if var_16 {
        var_1 = var_13;
        var_2


.col2 = v_make_plane_dir(vpos, vFar2, vFar3);
    plane03.col3 = v_make_plane_dir(vpos, vFar3, vFar0);
    v_mat44_transpose(plane03, plane03);

    plane3f planeNear = v_perm_xyzd(vdir, v_neg(v_dot3(vdir, vpos))),
            planeFar = v_perm_xyzd(v_neg(vdir), v_splat_w(v_sub(wpos, planeNear)));
    mat44f plane47;
    plane47.col0 = planeNear;
    plane47.col1 = planeFar;

#if TWO_MORE_PLANES
    vFar2 = v_add(leftrot, uprot);
    vFar1 = v_sub(leftrot, uprot);
    vFar0 = v_neg(vFar2); // vFar3 = v_neg(vFar1);
    vFar0 = v_add(vFar0, vdir);
    vFar1 = v_add(vFar1, vdir);
    vFar2 = v_add(vFar2, vdir); // vFar3 = v_add(vFar3, vdir);
    plane47.col2 = v_make_plane_dir(vpos, vFar1, vFar0);
    plane47.col3 = v_make_plane_dir(vpos, vFar2, vFar1);
    // we can add even more planes, but it will be at a cost of additional 4 planes..
#else
    plane47.col2 = planeNear;
    plane47.col3 = planeFar;
#endif
    v_mat44_transpose(plane47, plane47);

    cullFrustum(items, i, plane03, plane47, result_mask, word_count);
    // v_mat44_transpose(plane03, plane03);
    // vec3f tp = v_make_vec4f(-3.7626, 1.98745, 4.89138, 0);//v_add(vpos, v_mul(vdir, v_mul(V_C_HALF, v_splat_w(wpos))));
    // debug("dist %g %g %g %g | %g %g ", v_extract_x(v_plane_dist_x(plane03.col0, tp)),
    //       v_extract_x(v_plane_dist_x(plane03.col1, tp)), v_extract_x(v_plane_dist_x(plane03.col2, tp)),
    //       v_extract_x(v_plane_dist_x(plane03.col3, tp)),
    //       v_extract_x(v_plane_dist_x(planeNear, tp)), v_extract_x(v_plane_dist_x(planeFar, tp)));

    // static inline uint32_t
    // int x_center = (grid->rect.max_x+grid->rect.min_x)/2;
    // currentMasksStart += (grid->zmax-grid->zmin+1) * (grid->rect.max_y-grid->rect.min_y+1);
  }
  return items.itemsListCount;
}
// Copyright (C) Gaijin Games KFT.  All rights reserved.

#include <render/sphHarmCalc.h>
#include <drv/3d/dag_texture.h>
#include <drv/3d/dag_driver.h>
#include <drv/3d/dag_info.h>
#include <drv/3d/dag_query.h>
#include <drv/3d/dag_commands.h>
#include <drv/3d/dag_buffers.h>
#include <3d/dag_lockSbuffer.h>
#include <math/dag_TMatrix.h>
#include <math/dag_Point4.h>
#include <math/dag_adjpow2.h>
#include <shaders/dag_shaders.h>
#include <osApiWrappers/dag_miscApi.h>
#include <vecmath/dag_


术(@-@)\n" +
                    "> 给当前选中节点周围添加标记\n" +
                    "\t\t没有火眼金睛? 不要紧, 我来助你\n" +
                    "> 切换是否可以折叠(化bug为功能:D)\n" +
                    "> 显示描述和文本\n" +
                    "> 标记当前选中节点的兄弟\n" +
                    "> 标记当前选中节点的孩子\n" +
                    "> 标记当前选中节点的所有直系长辈(大概就这个意思-.-)\n" +
                    "> 布局分析, 为所欲为QwQ"
        )
        .item(
            R.id.modification_detail,
            R.drawable.ic_edit_black_48dp,
            "<=== 6588 ===>"
        )
        .item(
            R.id.modification_detail,
            R.drawable.ic_ali_log,
            "优化: 夜间模式\n\n" +
                    "优化: 布局层次分析页面\n" +
                    "> 修复展开后不可收起\n" +
                    "> 隐藏按钮可拖动\n\n" +
                    "修复(6587): 布局分析相关 bug\n\n" +
                    "更改(658): app抽屉页面使用随机彩色图标\n\n" +
                    "修复(6587): app布局分析刷新显示不全\n" +
                    "> 一般用不到刷新, 除非画面发生变动之后捕获结果没有改变\n" +
                    "> (刷新会比等待捕获多花 2-3 倍的时间)\n\n" +
                    "添加: app布局分析等待捕获、延迟捕获开关\n" +
                    "> 布局分析, 随心所欲(~.-\n\n" +
                    "添加: 截图是否返回新的对象\n" +
                    "> let img1 = images.captureScreen(true)\n" +
                    "> let img2 = images.captureScreen(true)\n" +
                    "> 即使一直使用同一张缓存图像(屏幕没有发生变化), img1 和 img2 都不会是同一个对象\n" +
                    "> 反之如果不加参数 true, img1 === img2"
        )
        .item(
            R.id.modification_detail,
            R.drawable.ic_edit_black_48dp,
            "<=== 6587 ===>"
        )
        .item(
            R.id.modification_detail,
            R.drawable.ic_ali_log,
            "添加: 获取屏幕实时宽高\n" +
                    "> let curW = device.getCurWidth()\n" +
                    "> let curH = device.getCurHeight()\n" +
                    "> let size = device.getCurScreenSize()\n" +
                    "> size.x == curW\n" +
                    "> size.y == curH\n\n" +
                    "添加: 获取当前屏幕方向\n" +
                    "> let ori = getCurOrientation()\n" +
                    "> 竖屏: 1  横屏: 2\n\n" +
                    "添加: app布局分析刷新开关\n" +
                    "> 有些情况刷新会出问题(比如某音极速版啥的)，可以关掉刷新，点开悬浮窗后，自己看情况等上一段时间再点分析\n\n"


s.InitializeComponent();
        }

        private async void ButtonUnpinEverything_Click(object sender, RoutedEventArgs e)
        {
            ButtonUnpinEverything.IsEnabled = false;

            // Loop through every secondary tile
            foreach (SecondaryTile tile in await SecondaryTile.FindAllAsync())
            {
                // Unpin each secondary tile
                await tile.RequestDeleteAsync();
            }

            ButtonUnpinEverything.IsEnabled = true;
        }
    }
}